Java程序OOM自动生成.hprof堆文件并使用jvisualvm分析
- 1.示例代码
- 2.编译两份源代码
- 3.带jvm参数启动
- 当内存溢出后,命令会出现
- 4.启动jvisualvm
- 5.导入堆文件
1.示例代码
同目录下准备两个.java源文件
StudentOne.java
public class StudentOne {private String id;private String name;private String sex;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}
}
test.java
import java.util.*;public class test {public static List list = new ArrayList<StudentOne>();public static void main(String[] args) {while (true) {StudentOne studentOne = new StudentOne();list.add(studentOne);}}
}
2.编译两份源代码
cmd 命令行中cd到源文件目录下执行:
注意编译顺序,先编译被依赖的类
javac StudentOne.java
javac test.java
3.带jvm参数启动
-Xms初始的Heap的大小
-Xmx最大Heap的大小
java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dumpfile.hprof test
其他jvm启动参数:
-XX:+HeapDumpOnOutOfMemoryError:当Java虚拟机因为OutOfMemoryError而崩溃时,可以配置这个参数让它自动生成堆内存的dump文件。
-XX:HeapDumpPath=<path>:指定堆内存dump文件的存储路径。
-XX:+HeapDumpBeforeFullGC:在Full GC之前生成堆内存的dump文件。
-XX:+HeapDumpAfterFullGC:在Full GC之后生成堆内存的dump文件。
-XX:+HeapDumpOnCtrlBreak:当用户按下Ctrl+Break(在Windows上)或者kill -3
当内存溢出后,命令会出现
4.启动jvisualvm
5.导入堆文件
点击导致 OutOfMemoryError 异常错误的线程,可以找到问题代码:
test.java第9行
这里可以看到StudentOne实例个数和总大小,实例个数为301314,总大小为12052560,单位为字节(B),换算成MB,为12052560➗1024➗1024≈11.49421691894531≈12MB,这也跟我们启动参数设置的最大堆分配内存设置-Xmx10m相差不大(-Xmx10m虽然限制最大堆分配内存为10m,但是并不能阻止jvm拓展,或许这个限制仅仅设置堆的拓展不能脱离这个值10m太远)
看不到这么多选项可以点击这个: