精华内容
下载资源
问答
  • 主要介绍了java内存溢出示例(堆溢出、栈溢出),需要的朋友可以参考下
  • (1)java堆溢出的原因: 程序不断创建对象,超过了java堆的内存。 (2)java堆溢出的现象: java.lang.outofmemoryerror: java heap space (3)java堆溢出的解决思路: 用memory analyzer对其分析,看是泄露...

    java堆存在的最主要的目的就是存储实例对象

    (1)java堆溢出的原因:

    程序不断创建对象,超过了java堆的内存。

    (2)java堆溢出的现象:

    java.lang.outofmemoryerror: java heap space

    (3)java堆溢出的解决思路:

    用memory analyzer对其分析,看是泄露还是溢出。如果是泄露的话,可以通过分析找到相应的代码进行修改。如果是溢出的话,可以考虑调节java堆的内存大小。-Xms 20m -Xmx 20m将最大和最小值设为相同,表示不可扩展。

     

     

     

    展开全文
  • 处理Java堆溢出的简单思路

    千次阅读 2018-10-14 20:06:41
    处理Java堆溢出的简单思路 java堆溢出 Java堆内存的OOM异常是实际应用中常见的内存溢出异常情况。当出现Java堆内存溢出时,异常堆栈信息“Java.lang.OutOfMemoryError”会跟着进一步提示"Java heap spacc"...

    处理Java堆溢出的简单思路

    java堆溢出

    Java堆内存的OOM异常是实际应用中常见的内存溢出异常情况。当出现Java堆内存溢出时,异常堆栈信息“Java.lang.OutOfMemoryError”会跟着进一步提示"Java heap spacc"。
    要解决这个区域问题可以使用——内存映像分析工具(如Eclipsc Memory Analyzer )对Dump出来的堆储存快照进行分析。——重点是确认内存中的对象是否是必要的,也就是要先分清楚到底出现了是内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)
    如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。
    如果不存在泄漏,那就应该检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否可以调大,从代码上检查是否存在某些对象生命周期过长,持有状况时间过长,尝试减少程序运行周期的内存消耗。

    以上就是处理Java堆内存问题的简单思路。

    展开全文
  • Java堆溢出及栈溢出

    千次阅读 2018-09-25 09:09:26
    内存溢出Out Of Memory(OOM):指申请内存时,没有足够的内存供其使用。 内存泄露Memory Leak:内存...堆溢出信息: OutOfMemoryError : Java heap space 分析工具:Eclipse Memory Analyzer 栈溢出 HotSpo...

    内存溢出Out Of Memory(OOM):指申请内存时,没有足够的内存供其使用。

    内存泄露Memory Leak:内存泄露,程序申请内存后,无法释放已申请的内存空间。内存泄露的堆积,浪费了内存空间,可能会造成OOM.

    堆溢出信息: OutOfMemoryError : Java heap space

    分析工具:Eclipse Memory Analyzer


    栈溢出

    HotSpot VM并不区分虚拟机栈和本地方法栈,所以 -Xoss参数(设置本地方法栈大小)在HotSpot无效,只能通过-Xss参数设置栈容量。

    1. 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
    2. 如果虚拟机在扩展栈时无法申请到足够的空间,抛出OutOfMemoryError异常。

    本质上是同一件事。

    经过验证——在单线程的情况下,无论是栈帧太大还是虚拟机容量太小,当内存无法分配是,抛出的都是StackOverflowError异常。

    分配给栈的内存并不是越大越好,因为栈内存越大,线程多,留给堆的空间就不多了,容易抛出OOM。JVM的默认参数一般情况没有问题(包括递归)。


    方法区和运行时常量池溢出

    运行时常量池是方法区的一部分。

    String.intern()是Native方法。

        1.8实测
            String sb1 = new StringBuilder("计算机").append("软件").toString();
            System.out.println(sb1.intern() == sb1);
    
            String string = new StringBuilder("Ja").append("va").toString();
            System.out.println(string.intern() == string);
            
            true
            false
    

    1.6之前执行intern()会把首次遇到的字符串实例复制到永久代,返回的也是永久代这个实例的引用,而StringBuilder实例在Java堆上,必然不是同一个引用,将返回false。

    1.7之后intern()不会再复制实例,只是在常量池中记录首次出现的实例引用,因此intern返回的引用和由StringBuilder创建的那个字符实例是同一个。由于java这个字符串常量池已经有了,所以intern返回的是常量池的引用,与string并不相等。

    方法区溢出:常见的内存溢出,一个类要被垃圾收集器回收掉,条件比较苛刻。在经常动态生成大量Class的应用中,需要特别注意。


    本机内存直接溢出

    -XX:MaxDirectMemorySize 指定DirectMemory,如果不指定,默认与Java最大值(-Xmx)一样。
    由DirectMemory导致的内存溢出,Heap Dump文件不会看到明显的异常,如果OOM之后Dump文件很小,而程序又直接使用了NIO,就要考虑是否是Direct Memory溢出了。

    展开全文
  • Java堆溢出(OOM for Heap) Java虚拟机内存模型中堆用于存储对象实例,当GC Roots到创建的对象之间有可达路径时,就可以避免垃圾回收机制回收这些对象,那么只要不断地创建这样的对象,当数量到堆的容量限制后就会...

    Java堆溢出(OOM for Heap)

    Java虚拟机内存模型中堆用于存储对象实例,当GC Roots到创建的对象之间有可达路径时,就可以避免垃圾回收机制回收这些对象,那么只要不断地创建这样的对象,当数量到堆的容量限制后就会产生堆内存溢出异常(OOM for Heap)。

    获取Heap Dump文件

    Heap Dump 是一个 Java 进程在某个时间点上的内存快照。 Heap Dump 是有着多种格式的。 不过总体上Heap Dump 在触发快照的时候都保存了 java 对象和类的信息。通常在写 Heap Dump 文件前会触发一次 FullGC,所以 Heap Dump 文件中保存的是 FullGC 后留下的对象信息。
    一般在 Heap Dump 文件中可以获取到( 这仍然取决于 Heap Dump 文件的类型) 如下信息:
     对象信息:类、成员变量、直接量以及引用值;
     类信息: 类加载器、 名称、 超类、 静态成员;
     Garbage Collections Roots: JVM 可达的对象;
     线程栈以及本地变量: 获取快照时的线程栈信息, 以及局部变量的详细信息。
    Heap Dump 文件中并不包含内存分配信息, 所以通常无法通过 Heap Dump 文件解决是谁以及在哪里创建了哪些对象这样的问题。

    MAT根据这个文件可以分析出内存泄露和高内存消耗的i。

    我们可以通过触发一次OOM for Heap来获取Heap Dump文件。

    测试代码:

    /**
     * 
     * @description HeapOOM
     * <p>Java堆异常测试</p>
     * <code>VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError</code>
     * <p>以上参数的含义是:限制Java堆大小为20MB,不可扩展</p>
     * <p>通过此参数可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照</p>
     * @author YellowStar
     * @date 2018年10月13日
     */
    public class HeapOOM {
    
        static class OOMObject { }
    
        public static void main(String[] args) {
    
            List<OOMObject> list = new ArrayList<OOMObject>();
            while (true) {
                list.add(new OOMObject());
            } /// while end
        } /// main
    } ///~
    
    /**
     * 运行结果:
     * java.lang.OutOfMemoryError: Java heap space
     * Dumping heap to F:\job\java_pid14444.hprof ...
     * Heap dump file created [28010445 bytes in 0.373 secs]
     * Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
     */

    Eclipse中的运行参数设置

    -Dfile.encoding=UTF-8   
    -Xms20m -Xmx20m ##设置堆大小20m,并将最小和最大值设置相等,避免扩展
    -XX:+HeapDumpOnOutOfMemoryError ##dump出当前的内存堆转储快照
    -XX:HeapDumpPath=F:\job   ##指定路径(转储文件还是挺大的)
    -XX:SurvivorRatio=8    ## 存活比2:8

    运行生成一个hprof格式的文件

    使用MAT工具分析文件

    分析三步曲

    通常我们都会采用下面的“三步曲”来分析内存泄露问题:

    首先,对问题发生时刻的系统内存状态获取一个整体印象。

    第二步,找到最有可能导致内存泄露的元凶,通常也就是消耗内存最多的对象

    接下来,进一步去查看这个内存消耗大户的具体情况,看看是否有什么异常的行为。

    下面将用一个基本的例子来展示如何采用“三步曲”来查看生产的分析报告。

    查看报告之一:内存消耗的整体状况

    在报告上最醒目的就是一张简洁明了的饼图,从图上我们可以清晰地看到一个可疑对象消耗了系统 97% 的内存。

    在图的下方还有对这个可疑对象的进一步描述。我们可以内存是由 java.lang.Object[]的数组实例消耗的,system class loader 负责这个对象的加载。这段描述非常短,但我相信您已经可以从中找到很多线索了,比如是哪个类占用了绝大多数的内存,它属于哪个组件等等。

    接下来,我们应该进一步去分析问题,为什么一个 Object[]会占据了系统 99% 的内存,谁阻止了垃圾回收机制对它的回收。

     

    查看报告之二:分析问题的所在

    首先我们简单回顾下 JAVA 的内存回收机制,内存空间中垃圾回收的工作由垃圾回收器 (Garbage Collector,GC) 完成的,它的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。

    在垃圾回收机制中有一组元素被称为根元素集合,它们是一组被虚拟机直接引用的对象,比如,正在运行的线程对象,系统调用栈里面的对象以及被 system class loader 所加载的那些对象。堆空间中的每个对象都是由一个根元素为起点被层层调用的。因此,一个对象还被某一个存活的根元素所引用,就会被认为是存活对象,不能被回收,进行内存释放。因此,我们可以通过分析一个对象到根元素的引用路径来分析为什么该对象不能被顺利回收。如果说一个对象已经不被任何程序逻辑所需要但是还存在被根元素引用的情况,我们可以说这里存在内存泄露。

    现在,让我们开始真正的寻找内存泄露之旅,点击“Details ”链接,可以查看对可疑对象 的详细分析报告。

    1. 我们查看下从 GC 根元素到内存消耗聚集点的最短路径:

    我们可以很清楚的看到整个引用链,内存聚集点是一个拥有大量对象的集合。

    接下来,我们再继续看看,这个对象集合里到底存放了什么,为什么会消耗掉如此多的内存。

    在这张图上,我们可以清楚的看到,这个对象集合中保存了大量 OOMObject对象的引用,就是它导致的泄露。

    然后就可以定位到相应的代码进行优化了。

     

     

     

    展开全文
  • 模拟Java堆溢出过程

    2019-06-22 12:59:46
    我们知道对象以及数组存在Java堆中,实际上数组也是对象,所以我们统称,实例对象存在Java堆上; 但是内存一定是有限的,只要不断的new对象,并且保障GC Roots到对象之间有可达路径来避免来GC清除这些对象,那么...
  • Java堆溢出

    2014-02-19 18:14:02
    Java堆用于存储对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量到达最大堆的容量限制后产生内存溢出异常。  以下代码中限制Java堆的大小...
  • java堆溢出

    2013-11-21 17:45:26
    import java.util.ArrayList; import java.util.List; public class Test { static class OOMObject{ } /** * @param args */ public static void main(String[] args) { // TODO Auto-gene
  • 主要介绍了Java 内存溢出原因分析,任何使用过基于 Java 的企业级后端应用的软件开发者都会遇到过这种报错,java.lang.OutOfMemoryError:Java heap space。,需要的朋友可以参考下
  • 《深入理解java虚拟机》-java堆溢出笔记 本人用的idea工具来演示java堆溢出,代码如下: import java.util.ArrayList; import java.util.List; /** * Description:JAVA堆内存溢出 * Author: wangfeng * Date: ...
  • NULL 博文链接:https://stride.iteye.com/blog/723340
  • Java 内存溢出梗概分析

    千次阅读 2018-04-16 11:24:31
    任何使用过基于 Java 的企业级后端应用的软件开发者都会遇到过这种低劣、奇怪的报错,这些报错来自于用户或是测试工程师: java.lang.OutOfMemoryError:Java heap space。 为了弄清楚问题,我们必须返回到算法复杂...
  • 分析Java堆:内存溢出的原因

    千次阅读 2020-10-21 15:39:39
      一般来说,绝大部分Java的内存溢出都属于堆溢出。原因是因为大量对象占据了堆空间,这些对象都持有强引用导致无法回收,当对象大小之和大于Xmx参数指定的堆空间时就会发生堆溢出; 解决办法 使用Xmx参数指定一...
  •  java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环;  如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决:  <jvm>-Xms3062m ...
  • Java内存溢出排查过程

    2020-04-08 22:52:54
    今天看到了敖丙的一篇关于排查内存溢出的博文,是自己没有接触过的知识,所以仿照过程自己也实验了一遍学习这部分的一些知识! 首先我使用的是Windows电脑,所以查看空间的插件在这里! 1、先看自己电脑的...
  • 当出现Java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError&amp;amp;quot;会跟着进一步提示”Java heap space“。 要解决这个区域异常,一般的手段是先通过内存映像分析工具对Dump出来的堆转储快照进行...
  • OutOfMemoryError异常——Java堆溢出

    千次阅读 2018-03-28 14:32:41
    Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。  下面代码限制Java堆的大小为...
  • 阻塞队列无界导致内存溢出的问题
  • Java内存溢出的几种情况

    千次阅读 2018-06-14 15:12:15
     Java堆溢出1.1 模拟场景1.2 用内存影响分析工具分析堆快照2.虚拟机栈和本地方法栈溢出2.1 StackOverflowError异常2.2 OutOfMemoryError异常3.方法区和运行时常量池溢出3.1 运行时常量区溢出3.2 String创建对象和...
  • OutOfMemoryError异常----Java堆溢出

    千次阅读 2016-08-08 15:21:03
    Java堆溢出 在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下面都叫OOM)异常的肯能,下面就通过一些实例来验证异常发生的场景。  在下面举的例子中,...
  • java代码实现JVM栈溢出,堆溢出

    千次阅读 2017-09-03 17:05:52
    背景知识: 栈存放什么:栈存储运行时声明的变量——对象引用(或基础类型, primitive)内存空间, ...堆溢出java.lang.OutOfMemoryError: Java heap space 栈溢出实现,可以递归调用方法,这样随着栈深度的增加,JVM
  • Java内存溢出异常及其处理

    千次阅读 2019-02-04 12:19:30
    熟悉Java内存划分及运行的首要目的就是预防JVM抛出内存溢出相关的异常,或者说当发生... 即使是最简单的访问,也会涉及Java栈、Java堆、方法区这三个最重要内存区域之间的关联关系。比如下面这行代码:  Object...
  • 在下列情况下,将引发内存异常:Java堆溢出、虚拟机堆栈和本地方法栈溢出、方法区域和运行时常数池溢出以及本地直接内存溢出。以下各节将逐一描述这些类型的异常。 Java堆溢出 正如Java内存区域和内存溢出异常中所...
  • 本文演示了编写代码使得出现”java.lang.OutOfMemoryError: Java heap space”异常,分析GC日志得出OOM的原因,同时对堆转储文件进行分析,以查看把Heap塞满的罪魁祸首;...用于测试Java堆OOM的代码
  • jvm堆溢出和栈溢出

    千次阅读 2019-08-14 11:29:45
    在jvm运行java程序时,如果程序运行所需要的内存大于系统的堆最大内存(-Xmx),就会出现堆溢出问题。 2、案例 // 介绍:执行该段代码需要大于10m内存空间 public class HeadOverflow { public static voi...
  • 内存溢出java.lang.OutOfMemoryErrory后面一般会跟上内存溢出的区域PermGen space(方法区), heap space(内存) 如果是PermGen space方法区内存溢出,可尝试加大MaxPermSize 如果是heap space 内存溢出,可...
  • java 堆溢出的解决方法

    千次阅读 2011-11-15 14:54:33
    JVM的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置. eclipse 有启动参数里设置jvm大小,因为eclipse运行时自己也需要jvm,所以eclipse.ini里设置的jvm大小不是具体某个程序运行时所用jvm的大小,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,077
精华内容 34,430
关键字:

java堆溢出

java 订阅