实战Java虚拟机之一“堆溢出处理”

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了实战Java虚拟机之一“堆溢出处理”脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

从今天开始,我会发5个关于java虚拟机的小系列
实战Java虚拟机之一“堆溢出处理”
[实战Java虚拟机之二“虚拟机的工作模式”][2]
[实战Java虚拟机之三“G1的新生代GC”][3]
实战Java虚拟机之四“禁用System.gc()”
实战Java虚拟机之五“开启JIT编译”

下面说说【实战Java虚拟机之一“堆溢出处理”】

在Java程序的运行过程中,如果堆空间不足,则有可能抛出内存溢出错误(Out Of Memory),简称为OOM。如下文字显示了典型的堆内存溢出:

Exception in threadmainjava.lang.OutOfMemoryError: Java heap space at geym.zbase.ch3.heap.DumpOOM.main(DumpOOM.java:20) 

一旦发生这类问题,系统就会被迫退出。如果发生在生产环境,可能会引起严重的业务中断。为了能够不断改善系统,避免或减少这类错误的发生,需要在发生错误时,获得尽可能多的现场信息,以帮助研发人员排查现场问题。Java虚拟机提供了参数-XX:+HeapDumpOnOutOfMemoryError,使用该参数,可以在内存溢出时导出整个堆信息。和它配合使用的还有-XX:HeapDumpPath,可以指定导出堆的存放路径。
【示例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) 

可以看到,虚拟机将当前的堆导出,并保存到D:/a.dump文件下。使用MAT等工具打开该文件进行分析,如图所示,可以很容易地找到这些byte数组和保存它们的Vector对象实例。有关MAT等工具的使用,可以参阅《实战Java虚拟机-jvm故障诊断与性能优化》第7章

除了在发生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目录,进行尝试。


节选自

实战Java虚拟机之一“堆溢出处理”

脚本宝典总结

以上是脚本宝典为你收集整理的实战Java虚拟机之一“堆溢出处理”全部内容,希望文章能够帮你解决实战Java虚拟机之一“堆溢出处理”所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。