前言
最近在学习群里面,有聊到近几天排查生产问题上面的OOM事故。
有兄弟私聊问到怎么看。
其实非常简单,但是我想了下是不是有很多人没接触过?或者是望而生畏?
那么,就来做个简单的小教程示例吧。
正文
简单写个User类 :
public class User {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后写个循环一直new User(), 直接制造出OOM:
public class TestUtil {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
do {
User user = new User();
user.setName(UUID.randomUUID().toString());
userList.add(new User());
} while (true);
}
}
执行一下这个测试例子:
很好,OOM看到了 OutOfMemoryError 。
接下来,就是我们简单的分析。 怎么去看OOM。
我们通过heap dump 文件分析问题即可。
怎么整?
两步 :
① 设置 OOM 生成堆转储文件
②用java自带的Java visualVM 分析文件
我们运行的时候,加上参数 -XX:+HeapDumpOnOutOfMemoryError
HeapDumpOnOutOfMemoryError 是 Java 虚拟机的一个选项。当发生 OutOfMemoryError(内存溢出错误)时,
设置了该选项后,Java 虚拟机会生成一个堆转储文件(heap dump),用于分析导致内存溢出的原因。
当然还可以顺便指定文件生成的路径 (-XX:HeapDumpPath=<转储文件路径> ),不指定就是默认项目所在的根路径下。
为了方便我们例子操作,我们把运行可用的内存分配小些,这样for循环跑几下就报OOM了。
-Xmx10m
linux环境可以这样:
java -Xmx10m -XX:+HeapDumpOnOutOfMemoryError -jar xxxx.jar
我们是本地自己电脑,在idea上设置一下即可:
然后重新跑下我们的测试例子:
OK,第一步完成,接下来就是第二步,分析文件找原因。
先瞧一眼刚才生成的文件:
然后去打开java自带的分析工具 Java visualVM:
打开看到这个样子:
然后打开我们需要分析的文件:
可以看到在概要栏这里,明显告诉我们,有个main方法报了OOM :
点进去main细看一下:
那么我们再看看 类 这一栏,看看具体咋回事 :
ps: 这里的大小单位是 字节
OK,基本能确定问题:
这个main函数里面,无限循环,一直new User ,把内存用炸了(毕竟我们故意设置了10m内测)。
OK.该篇就到这。