为了熟悉dump文件和jdk自带的jvm分析工具,
本人决定制造一个OOM,得到jvm的dump文件,并使用jdk自带的jvisualvm工具解析
前置操作
如何制造OOM?
这里采用的方式是不断创建对象,因为创建对象会涉及内存分配,不断地分配内存而不释放就会导致OOM
package com.example.demo22;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
@SpringBootApplication
public class Demo22Application {
class User{
}
public static void main(String[] args) {
SpringApplication.run(Demo22Application.class, args);
}
//项目启动时的初始化方法
// 死循环不断创建对象,制造OOM
@PostConstruct
public void init() {
ArrayList list = new ArrayList<>();
while (true) {
list.add(new User());
}
}
}
操作步骤
- 设置jvm运行参数,目的是令jvm发生OOM时生成jump文件(文件后缀是.hprof ),该文件默认会在项目的根目录生成
- 项目发生OOM时,会在日志提示错误信息并打印dump文件名称
- 使用jdk自带的工具 jvisualvm 来解析dump文件从而还原“案发现场”(位于bin目录下)
控制台日志提示 be like:
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid132332.hprof …
jvm参数设置参考
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
细节截图
-
如何在idea中设置JVM参数
-
如何在idea中打开项目的根目录
-
项目发生OOM之后,控制台的日志和出现在根目录下的dump文件
-
找到jdk的bin目录下的jvisualvm,载入dump文件
-
查看dump文件
-
其他:如何找到jdk安装路径?
可以在idea的配置找,或者查看下电脑的环境变量当时是怎么配置的java环境变量的
其他收获
jdk的bin目录放了很多有用的工具,可以慢慢研究:
包含一些用于开发Java程序的工具,例如:编译工具(javac.exe)、运行工具 (java.exe) 、打包工具 (jar.exe)等。