美文网首页
Java堆溢出

Java堆溢出

作者: setone | 来源:发表于2018-08-16 11:12 被阅读0次
image.png

1.java堆
所有对象的实例分配都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节
VM:

-verbose:gc -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError

代码:

 public class HeapOOM {
    static class OOMOBject {
    }

    public static void main(String[] args) {
        List<OOMOBject> list = new ArrayList<>();
        for (int i = 0; i < i+1; i++) {
            list.add(new OOMOBject());
            Console.log("i-----------------"+i);
        }
    }
}

控制台异常


image.png

java堆内存的OutOfMemoryError异常是实际应用中最常见的内存溢出异常情况。出现java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟着进一步提示“java heap space”.
要解决这个区域的异常,一般的手段是首先通过内存映像分析工具对dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(memory leak)还是内存溢出(Menory OverFlow)
如果是内存泄漏(Memory Leak),可进一步通过工具查看泄漏对象到GC Roots的引用链,于是就能找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收他们的,掌握了泄露对象的类型信息以及GC
Roots引用链的信息,就可以比较精准地定位出泄漏代码的位置。
如果不存在泄漏,换句话说就是内存中的对象确实必须存活着不能被GC掉,那就应当检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否可以调大,从代码上检查是否存在某些对象生命周期过长,持有状态时间过长的情况,尝试减少程序运行期间的内存消耗
每new一次就会在堆里面占用一次内存,list.add保证了new出来的对象不会被GC,最后java堆放不下,就炸了

相关文章

网友评论

      本文标题:Java堆溢出

      本文链接:https://www.haomeiwen.com/subject/volnbftx.html