在Java程序中,如果堆空间不足,有可能抛出内存溢出错误:Out Of Memory,简称OOM。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.stylefeng.guns.rest.NewSizeDemo.main(NewSizeDemo.java:10)
一旦发生这种问题,系统就会被迫退出。
Java虚拟机提供了参数 -XX:+HeapDumpOnOutOfMemoryError ,使用该参数可以在内存溢出时导出整个堆信息。可以使用参数 -XX:HeapDumpPath,指定导出堆的存放路径。
使用如下命令将当前的堆导出,并保存到D:/a.dump文件下,使用MAT工具打开该文件进行分析。
-Xmx20m -Xms20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
除了在发生OOM时可以导出堆信息外,虚拟机还允许在发生错误时执行一个脚本文件,用于奔溃程序的自救、报警或通知。
准备printstack.bat脚本如下:
D:/tools/jdk/bin/jstack -F %1 > D:/a.txt
以上脚本会导出给定Java虚拟机进程的线程信息,保存到a.txt文件中。