深入理解java虚拟机-内存快照分析

 2019-12-22 10:52  阅读(1847)
文章分类:JVM

-、情景复现

这里举一个栗子,最简单的 java.lang.OutOfMemoryError: Java heap space错误的分析思路。

简单代码:

public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            while(true){
                list.add(new String());
                System.out.println(1);
            }
        }

抛出异常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3210)
        at java.util.Arrays.copyOf(Arrays.java:3181)
        at java.util.ArrayList.grow(ArrayList.java:261)
        at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
        at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
        at java.util.ArrayList.add(ArrayList.java:458)
        at com.compare_1.Main.main(Main.java:13)

//熟悉的配方 熟悉的味道

一般在简单的程序中,我们浏览代码能迅速的定位到问题所在。然后就可以从硬件或者代码优化来解决这个问题,但是在实际操作过程中,有出现比较复杂的情况,就需要使用一些工具来辅助程序猿来找到出现问题的代码。

二、内存快照

-XX:+HeapDumpOnOutOfMemoryError

2019120001378\_1.png

配置VM arguments,加入上面的这条设置,在内存报错时则可以生成快照。快照存储在当前项目所在的workspace中

2019120001378\_2.png

三、Memory Analyzer 快照分析工具

下载:http://www.eclipse.org/mat/downloads.php

1)选择适合的版本然后打开(不多说)。

2)选择快照,打开-工具左上角-File-Open Head Dump。

3)分析

3.1overview 全局分析内存使用情况

2019120001378\_3.png

深颜色表示出错内存所占总分配内存的总数,这里-Xms20m -Xmx20m。

3.2 Open Dominator Tree

这里加载堆内存的所有信息,百分比让问题显而易见。

这里 Shallow Heap 单个对象所占大小。

Retained Heap 所有对象及引用所占大小。(垃圾回收)

2019120001378\_4.png

3.3定位出错所在

2019120001378\_5.png

总结

目前刚接触这个分析工具,这里简单描述下思路,未来会持续更新。

— over–

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 深入理解java虚拟机-内存快照分析

相关推荐