内存溢出 订阅
内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免 [1]  。 展开全文
内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免 [1]  。
信息
领    域
计算机科学
原    因
程序实际运行需要内存的大小不够
简    称
OOM
影    响
使程序终止运行
中文名
内存溢出
解决方法
关闭软件、重启电脑或者软件、增加内存
外文名
out of memory
内存溢出简介
内存溢出已经是软件开发历史上存在了近40年的“老大难”问题,像在“红色代码”病毒事件中表现的那样,它已经成为黑客攻击企业网络的“罪魁祸首”。 如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。据有关安全小组称,操作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大多数与微软的技术有关。内存溢出错误是大数据处理平台的常见错误,例如,国际知名的程序开发者问答网站 stackoverflow 上关于“Hadoop out of memory”的问题超过10000个,在Spark邮件列表上有10%的问题是关于“out of memory”。 内存溢出错误会导致处理数据的任务失败,甚至会引发平台崩溃等严重后果。对于内存溢出大部分的处理方法是重新执行任务,然而, 对于由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免 [1]  。内存溢出通俗理解就是内存不够,是指运行程序时要求的内存,超出了系统所能分配的范围,从而导致发生内存溢出。一般在运行大型软件时,所需的内存远远超出了主机内安装的内存所承受大小时就会发生这种情况。当出现内存溢出这种情况,系统一般会提示相关信息,有时候会自动关闭软件甚至会造成设备卡死等现象,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件或游戏一段时间。 [2] 
收起全文
精华内容
下载资源
问答
  • 内存溢出

    2019-04-25 10:36:02
    1.什么是内存溢出 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。 2.引起内存溢出的原因  1.内存中加载的数据量过于庞大,如一次从数据库...

    1.什么是内存溢出
    内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。
    2.引起内存溢出的原因
      1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
      2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
      3.代码中存在死循环或循环产生过多重复的对象实体;
      4.使用的第三方软件中的BUG;
      5.启动参数内存值设定的过小;
    3.内存溢出解决方案
    第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
    第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
    第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
    4.出现内存溢出如何排查
    1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
    2.检查代码中是否有死循环或递归调用。?
    3.检查是否有大循环重复产生新对象实体。?
    4.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
    5.内存溢出分类
    主要是堆堆溢出:
    a.内存泄露:是指对象实例在新建和使用完毕后,仍然被引用,没能被垃圾回收释放,一直累计只到没有剩余的内存可用;
    b.内存溢出:当我们新建一个实例对象时,实例对象所需占用的内存空间大于堆的可用空间.

    展开全文
  • 内存溢出配置,内存溢出配置内存溢出配置内存溢出配置
  • jvm内存溢出解决方法,详细内容看下面解释
  • jvm 内存溢出-直接内存溢出 DirectMemory 容量可通过 -XX:MaxDirectMemorySize 指定,如果不指定,则默认与 Java 堆最大值( -Xmx 指定)一样,下面程序利用 DirectByteBuffe 模拟直接内存溢出的情况 import java....

    jvm 内存溢出-直接内存溢出

    DirectMemory 容量可通过 -XX:MaxDirectMemorySize 指定,如果不指定,则默认与 Java 堆最大值( -Xmx 指定)一样,下面程序利用 DirectByteBuffe 模拟直接内存溢出的情况

    import java.nio.ByteBuffer;
    import java.util.ArrayList;
    import java.util.List;
    
    public class DirectBufferOom {
      public static void main(String[] args) {
        final int _1M = 1024 * 1024;
        List<ByteBuffer> buffers = new ArrayList<>();
        int count = 1;
        while (true) {
          ByteBuffer byteBuffer = ByteBuffer.allocateDirect(_1M);
          buffers.add(byteBuffer);
          System.out.println(count++);
        }
      }
    }
    
    

    在命令行运行 java -XX:MaxDirectMemorySize=10M DirectBufferOom ,很快控制台就会出现异常

    Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
        at java.nio.Bits.reserveMemory(Bits.java:695)
        at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
        at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
        at DirectBufferOom.main(DirectBufferOom.java:12)
    

    其实它并没有真正向操作系统申请分配内存,而是通过计算得知内存无法分配,于是手动抛出异常。下面的程序利用 Unsafe 类模拟直接内存溢出

    import sun.misc.Unsafe;
    
    import java.lang.reflect.Field;
    
    public class UnsafeOom {
      private static final int _1M = 1024 * 1024;
    
      public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
        Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
        unsafeField.setAccessible(true);
        Unsafe unsafe = (Unsafe) unsafeField.get(null);
        while (true) {
          unsafe.allocateMemory(_1M);
        }
      }
    }
    
    

    在命令行运行 java -XX:MaxDirectMemorySize=10M UnsafeOom ,结果如下

    Exception in thread"main"java.lang.OutOfMemoryError
    at sun.misc.Unsafe.allocateMemory(Native Method)
    at org.fenixsoft.oom.DMOOM.main(DMOOM.java:20)
    
    

    由 DirectMemory 导致的内存溢出,一个明显的特征是在 Heap Dump 文件中不会看见明显的异常,如果读者发现 OOM 之后 Dump 文件很小,而程序中又直接或间接使用了 NIO ,那就可以考虑检查一下是不是这方面的原因。

    展开全文
  • java内存溢出之永久代内存溢出

    千次阅读 2018-02-03 15:29:25
    在实际开发中,我们经常会遇到oom,即所谓的内存溢出情况,但是不能是所有的内存溢出都一概而论,我们需要搞清楚具体内存的溢出原因和分类然后对症下药。这里和大家一起学习一下内存溢出中的永久代内存溢出。 ...

    前言

    在实际开发中,我们经常会遇到oom,即所谓的内存溢出情况,对于内存溢出,我们需要搞清楚具体内存的溢出原因,然后对症下药。这里和大家一起学习一下永久代内存溢出。

    永久代内存溢出概述

    对于JVM的分代策略,想必大家都清楚。之所以对内存进行分代是为了能够更有效的对内存进行回收,对于jvm的分代,大家有兴趣的可以学习,这点不重点讲述。在jvm中的永久代中主要存放是经过几次GC之后依旧没有被回收的对象,而永久代不是经常进行GC,所以在项目运行汇总,如果加载了大量的类,永久代没有及时的回收,后面再向永久代中分配内存的时候,发现已经没有内存可以分配,就会出现下面这货
    这里写图片描述
    对于解决上面的异常,我们首先需要了解jvm中几个内存参数
    – -XX:+HeapDumpOnOutofMemoryError,dump的时候转储堆快照
    – -Xms 堆最小容量(heap min size)
    – -Xmx 堆最大容量(heap max size)
    – -Xss 栈容量(stack size)
    – -XX:PermSize=size 永生代最小容量
    – -XX:MaxPermSize=size 永生代最大容量
    一般我们在遇到内存溢出的时候首先想到的就是增加上面这些参数值。我们需要根据我们的实际情况来设置我们的内存参数,如果是堆内存溢出,我们应该增加堆内存参数而不是栈内存参数和永久代内存参数,找过具体的内存溢出类型然后修改对应的参数,这种方式比较好,同时增加内存这种固化的解决方式有时候确实能够解决内存溢出问题,但是如果是我们代码本身有内存泄露的漏洞的话,上面的方法无异乎于扬汤止沸。这时候我们就需要一些工具来具体查看内存泄露和溢出的原因了,这里不做深究。

    如何修改上面的参数值

    首先我们如果是在IDE工具上发布项目,比如说eclipse,这时候发现了永久代内存溢出,那么我们就需要从eclipse上修改一些默认的内存参数。
    我们可以找到eclispe上的window菜单栏,找到preferences,再找到java选项,然后在找到对应的installed jre,编辑对应的java运行环境,如下图
    这里写图片描述
    在default vm arguments来设置全局内存参数,这里如-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=512m然后点击保存。
    这里写图片描述
    然后重新发布项目,可以在console窗口中查看这样的参数来验证自己的vm arguments设置是否有效
    这里写图片描述
    如果我们是将项目打成war包形式进行发布,在运行的过程中出现的了内存溢出,那么我们可以在tomcat上面修改启动参,在tomcat的bin目录下main找到catalina.bat直接右击编辑。然后在“rem ----- Execute The Requested Command ----------------------”下面加上参数设置,JAVA_OPTS="-server -Xms800m -Xmx800m -XXNewSize=256M -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m",当然具体的内存大小要结合自己设备的可用内存来确定,不能一味的设置大数字,这样可能会导致tomcat启动不了。
    这里写图片描述
    需要注意的是,如果我们在eclipse中运行项目,结果出现永久代内存溢出的情况,我们最好采用第一种方式来修改内存参数,如果直接在tomcat中的catelina.bat中修改可能没有作用,这点需要注意。当然还要其他方式设置参数,例如在eclipse的安装目录下面的eclipse.ini文件中直接设置启动参数也是可以的。

    展开全文
  • tomcat内存溢出

    2017-11-23 11:13:23
    tomcat内存溢出,里面列出集中导出内存溢出的愿意和解决方案。
  • 主要介绍了Java内存溢出和内存泄露的相关资料,需要的朋友可以参考下
  • Android 内存溢出和内存泄漏的问题 在面试中,经常有面试官会问“你知道什么是内存溢出?什么是内存泄漏?怎么避免?”通过这篇文章,你可以回答出来了。 内存溢出 (OOM)是指程序在申请内存时,没有足够的内存空间...
  • jvm内存溢出

    2017-06-28 14:45:40
    jvm内存溢出 学习笔记
  • tomcat内存溢出总结

    2020-08-10 09:18:27
    绍tomcat内存溢出总结
  • 详细介绍了android内存及内存溢出的问题,有需要的朋友可以参考一下
  • websphere内存溢出

    2018-04-11 16:15:23
    涵盖websphere内存溢出处理方法、使用与诊断调优等,内容详实
  • 在程序编写过程中,内存溢出和内存泄漏是我们经常关心的问题,如何避免内存泄漏和溢出是我们每个程序员应该必备的技能,这边文章介绍内存溢出和泄漏已经如何避免这两种情况的发生。

    在程序编写过程中,内存溢出和内存泄漏是我们经常关心的问题,如何避免内存泄漏和溢出是我们每个程序员应该必备的技能,这边文章介绍内存溢出和泄漏已经如何避免内存溢出和内存泄漏这两种情况的发生。

    一、什么是内存溢出
    内存溢出(out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。
    或是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。
    二、什么是内存泄漏
    内存泄漏是指程序中间动态分配了内存,但在程序结束时没有释放这部分内存,从而造成那部分内存不可用的情况,内存泄露和硬件没有关系,它是由软件设计缺陷引起的。
    内存泄露一般分为以下几种情况:

    1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
    2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
    3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
    4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

    三、内存溢出和内存泄漏的异同点
    同:都会导致应用程序运行出现问题,性能下降或挂起。
    异:
    1) 内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出。
    2) 内存泄露可以通过完善代码来避免;内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。

    四、如何避免内存泄漏、溢出

    1. 尽早释放无用对象的引用。
      好的办法是使用临时变量的时候,让引用变量在退出活动域后自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。

    2. 程序进行字符串处理时,尽量避免使用String,而应使用StringBuffer。因为每一个String对象都会独立占用内存一块区域,如:

      String str = "aaa";    
      String str2 = "bbb";    
      String str3 = str + str2;    
      // 假如执行此次之后str , str2再不被调用,那么它们就会在内存中等待GC回收;    
      // 假如程序中存在过多的类似情况就会出现内存错误;   
      
    3. 尽量少用静态变量。
      因为静态变量是全局的,GC不会回收。

    4. 避免集中创建对象尤其是大对象,如果可以的话尽量使用流操作。因为
      JVM会突然需要大量内存,这时会触发GC优化系统内存环境;

    5. 尽量运用对象池技术以提高系统性能。
      生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。

    6. 不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。
      可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃。

    7. 优化配置

       1、 设置-Xms、-Xmx相等;
       2、 设置NewSize、MaxNewSize相等;
       3、 设置Heap size, PermGen space:
       	 Tomcat 的配置示例:修改 %TOMCAT_HOME%/bin/catalina.bat or catalina.sh
            在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
           set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 
      

    更多的配置,可以参考另一篇文章:https://blog.csdn.net/LeegooWang/article/details/88696195

    展开全文
  • 内存溢出资料

    2011-10-08 21:53:36
    内存溢出资料 内存溢出资料 内存溢出资料 内存溢出资料
  • 内存溢出处理方法

    2017-04-01 15:57:53
    内存溢出处理办法,生成内存溢出分析文件,可清楚因为什么原因导致内存溢出
  • Java内存溢出及分析

    2020-12-22 23:07:51
    对于内存溢出,首先想到的是C语言,其实不然,java中也有各种的内存溢出。对于java程序员,在虚拟即中,不需要为每一个新建对象去delete/free内存,不容易出现内存溢出。但是,正  是由于这种机制,java中如果出现...
  • Java内存溢出

    2013-08-20 12:03:22
    Java内存溢出类型及java内存溢出解决办法
  • 内存溢出(Out Of Memory):Android系统中每一个应用程序可以向系统申请一定的内存,当申请的内存不够用的时候,就产生了内存溢出。 内存泄漏:当某个对象不再被使用,即不再有变量引用它时,该对象占用的内存就会...
  • 主要介绍了java内存溢出示例(堆溢出、栈溢出),需要的朋友可以参考下
  • WAS 内存溢出分析

    2018-12-04 20:43:16
    Websphere Application Server WAS 内存溢出分析,帮助分析内存问题
  • 主要介绍了Java虚拟机内存溢出与内存泄漏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了Java内存区域与内存溢出异常详解的相关资料,需要的朋友可以参考下
  • 主要介绍了JAVA 内存溢出案例的汇总,文中讲解非常细致,帮助各位工作学习时避免内存溢出,感兴趣的朋友可以了解下
  • JAVA内存溢出

    2016-04-21 10:18:55
    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
  • 易语言防止文件内存溢出源码,防止文件内存溢出,读入子程序

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 332,964
精华内容 133,185
关键字:

内存溢出