从今天开始,我会发5个关于java虚拟机的小系列:
下面说说【实战Java虚拟机之一“堆溢出处理”】
在Java程序的运行过程中,如果堆空间不足,则有可能抛出内存溢出错误(Out Of Memory),简称为OOM。如下文字显示了典型的堆内存溢出:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space at geym.zbase.ch3.heap.DumpOOM.main(DumpOOM.java:20)
【示例3-4】以下代码合计分配了25M内存空间。
public class DumpOOM { public static void main(String[] args) { Vector v=new Vector(); for(int i=0;i<25;i++) v.add(new byte[1*1024*1024]); } }
使用如下参数执行上述代码:
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump显然20M堆空间不足以容纳25M内存,系统比如发生内存溢出,在发生错误后,控制台输出如下:
java.lang.OutOfMemoryError: Java heap space Dumping heap to d:/a.dump … Heap dump file created [23067302 bytes in 0.160 secs] Exception in thread “main” java.lang.OutOfMemoryError: Java heap space at geym.zbase.ch3.heap.DumpOOM.main(DumpOOM.java:19)
除了在发生OOM时可以导出堆信息外,虚拟机还允许在发生错误时执行一个脚本文件。该文件可以用于奔溃程序的自救、报警或者通知,也可以帮助开发人员获得更多的系统信息,如完整的线程转存(即Thread Dump或者Core Dump)文件。
这里给出一个在发生OOM时导出线程转存的例子。准备printstack.bat脚本如下:
D:/tools/jdk1.7_40/bin/jstack -F %1 > D:/a.txt以上脚本将会导出给定Java虚拟机进程的线程信息,并保存在D:/a.txt文件中。
使用如下参数执行上述代码:
-Xmx20m -Xms5m “-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p” -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump在程序异常退出时,系统D盘下会生成新文件a.txt,里面保存着线程转存信息。本例中,文件路径“D:/tools/jdk1.7_40”为笔者的JDK按照目录,读者可以替换成自己的JAVA_HOME目录,进行尝试。
原文地址:http://blog.csdn.net/xinaij/article/details/44829537