暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用JProfiler 分析 OOM

TechStyle 2021-07-17
828

模拟

先模拟一个OOM的类

package org.fool.test;


import java.util.LinkedList;
import java.util.List;


public class TestOOM {
public static class OOMObject {
byte[] b = new byte[1024];
}


/**
* -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
*/
public static void main(String[] args) {
List<OOMObject> list = new LinkedList<>();
while (true) {
list.add(new OOMObject());
}
}
}
复制

Note:自定义一个类OOMObject,然后在main 函数中创建一个LinkedList,开启一个while 死循环,不断往list 中添加OOMObject


测试

启动测试前需要配置VM Options,这里为了快速模拟出OOM 溢出的效果,故将堆内存设置成 20M

 -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
复制


运行测试,抛出了 java.lang.OutOfMemoryError


分析 

使用JProfiler 打开 tmp 目录下的 java_pid52952.hprof 文件

Note:JProfiler 是唯一一款获过奖的Java剖析工具,被誉为业界“最好的Java 剖析/测试工具”,作为一款商业授权的软件,使用需要购买 license,可以前往 EJ 官网下载对应的版本

https://www.ej-technologies.com/download/jprofiler/files
复制


双击TestOOM$OOMObject


在References 选择Incoming references


随机选择一个,点击右上方的 Show Paths To GC Root,定位到问题出现在代码的17行

Note:Java 的垃圾回收使用的是 可达性分析算法,它的核心目的就是判断Java 对象是否存活。




泰克风格 只讲干货 不弄玄虚

文章转载自TechStyle,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论