内存溢出 订阅
内存溢出(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 内存溢出-直接内存溢出 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文件中直接设置启动参数也是可以的。

    展开全文
  • 内存溢出和内存越界

    万次阅读 2018-04-28 09:29:22
    内存溢出和内存越界的有啥区别呢,还是先看定义。 内存溢出:你要分配的内存超出了系统能给你的,系统不能满足需求,于是产生了溢出 内存越界:你想系统申请一块内存,在使用的这块内存的时候,超过出了你申请的范围...

          ❤️强烈推荐人工智能学习网站❤️ 

          内存溢出和内存越界的有啥区别呢,还是先看定义。

           内存溢出:你要分配的内存超出了系统能给你的,系统不能满足需求,于是产生了溢出

           内存越界:你想系统申请一块内存,在使用的这块内存的时候,超过出了你申请的范围

           它们都属于不恰当的使用了内存,只是形式不同而已,所以产生了2个名词来分别表示它们,下面看一下简答的代码实例。

    内存越界:

    int a[10];
    a[12] = 10

    内存溢出:

    char str[5] = "1234567";

            很简单,只是不要把它们的定义搞混了。

     

     

     

    展开全文
  • 内存溢出的情况分析

    万次阅读 2020-08-10 09:35:58
    此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然...
  • 在程序编写过程中,内存溢出和内存泄漏是我们经常关心的问题,如何避免内存泄漏和溢出是我们每个程序员应该必备的技能,这边文章介绍内存溢出和泄漏已经如何避免这两种情况的发生。
  • 关于内存泄漏和内存溢出

    多人点赞 热门讨论 2020-07-20 18:23:48
    最近负责维护的一个项目出现了内存溢出的现象,今天就顺便说下内存泄漏和内存溢出 简单释义: 一、内存溢出和内存泄露 一种通俗的说法。 1、内存溢出:打个比喻,比如你申请了100个字节的空间,但是你在这个空间写入...
  • Java中什么情况产生年轻代内存溢出、什么情况产生年老代内存溢出 谢谢各位大佬指教
  • 1.1内存溢出和内存泄漏 2.内存溢出 2.1 栈溢出 2.2堆溢出 2.3永久代溢出 2.4 java常见的几种内存溢出及解决方法 3.内存泄漏 3.1为什么会产生内存泄漏 3.2 解决方式 1.介绍 作为一个Java开发者,想必大家都...
  • 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内存泄露 memory leak,是指程序在申请...
  • mapreduce内存溢出

    2020-02-27 16:27:57
    1.简单了解mapreduce任务 一个mapreduce任务会启动多种进程,首先需要启动一个客户端进程,客户端进程向rm申请资源启动am...在任务提交阶段的内存溢出,则是客户端内存溢出,在启动任务前,调整环境变量HA...
  • 内存溢出,内存泄漏,内存抖动

    千次阅读 2018-11-19 11:17:57
    内存溢出,内存泄漏,内存抖动你都碰到过吗?怎么解决的?如何区分这几种情况?怎么解决由内存泄漏而导致的内存溢出? 内存优化 . 内存泄露 内存溢出 内存抖动 分析与解决 内存溢出和内存泄漏的区别、产生原因以及...
  • 内存泄漏和内存溢出

    万次阅读 多人点赞 2018-08-22 15:28:58
    内存溢出:(out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。 内存泄漏:(Memory Leak)是指程序中己动态分配...
  • 内存溢出排错

    2020-02-05 23:11:37
    定位出内存溢出的空间:堆,栈还是永久代(jdk8以后不会出现永久代的内存溢出)。 如果是堆内存溢出,看是否创建了超大的对象 如果是栈内存溢出,看是否创建了超大的对象,或者产生了死循环。 ...
  • Java与C++之间有- -堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 2.1 概述 对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”...
  • HashMap内存内存溢出问题

    千次阅读 2019-07-06 11:41:44
    HashMap内存内存溢出问题: https://www.jianshu.com/p/54c388e9bf3b
  • 内存泄露和内存溢出

    2018-05-11 15:53:18
    内存溢出:比如你将一个100MB的文件转换成流,即将100MB的东西读到内存,如果一直不关闭,则java认为你一直在使用,就不进行垃圾回收,有可能导致内存溢出。 Java的内存溢出和内存泄露Java基础恶补——内存泄露...
  • 内存泄露和内存溢出的区别,内存泄露和内存溢出到底有什么区别啊 1. 内存溢出和内存泄露的区别: 内存溢出的角度不一样的,申请的内存空间,超出了最大的内存空间,这就叫做内存溢出,内存溢出是在申请内存空间的时候, ...
  • 出处1:http://www.iteye.com写java程序时大家一定对一下两条异常并不陌生: java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: Perm... 好的编码实践可能会大大降低内存溢出的产生。 ...
  • 内存溢出 out of memory : 内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求。内存泄漏的堆积会发生内存溢出。 2) 1.虚拟机栈和本地方法栈内存溢出 发生这种问题的...
  • jmeter内存溢出解决方法(OutOfMemoryError:内存溢出

    万次阅读 热门讨论 2018-06-24 15:55:25
    如果出现了内存溢出的问题,可以通过调整JVM内存相关的参数进行优化。    具体过程如下: 1、找到jmeter.bat文件,也就是我们启动jmeter的脚本: 2、打开jmeter.bat文件,对以下这些配置项进行编辑: ...
  • 内存溢出和内存泄漏

    千次阅读 2018-05-02 22:29:25
    内存溢出(out ofmemory) 通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。此时软件或游戏就运行不了,系统会提示内存溢出,有...
  • 内存溢出和内存泄漏 内存溢出一般是指执行内存少于实际需要的内存,就会造成内存溢出 内存溢出造成的结果是先前保存的数据会被覆盖或者后来的数据会没地方存 内存溢出一般发生在后台 内存泄漏是指程序执行时,一些...
  • *内存泄漏和内存溢出

    千次阅读 2017-06-27 14:03:20
    (1)内存泄漏和内存溢出 内存泄漏:分配出去的内存无法回收(不再使用的对象或者变量仍占内存空间),在Java中内存泄漏就是存在一些被分配的对象(可达的,却是无用的)无法被gc回收。 内存溢出:程序要求的内存...
  • eclipse内存溢出解决办法查看内存 编辑该知识 1 查看内存: workspace/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs,在里面加上SHOW_MEMORY_MONITOR=true,重启eclipse,就...
  • tomcat内存溢出原因分析与解决以及java内存溢出、栈溢出的原因与排查方法
  • 内存溢出,栈溢出以及内存泄露

    千次阅读 2019-04-13 22:42:53
    内存溢出(OutOfMemoryError):应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。 内存溢出的类型: (1)java.lang.OutOfMemoryError: PermGen space ...

空空如也

1 2 3 4 5 ... 20
收藏数 37,281
精华内容 14,912
关键字:

内存溢出