zoukankan      html  css  js  c++  java
  • 实战Java虚拟机之一“堆溢出处理”

    从今天开始,我会发5个关于java虚拟机的小系列:

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

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

    1. Exception in thread “main” java.lang.OutOfMemoryError: Java heap space  
    2. at geym.zbase.ch3.heap.DumpOOM.main(DumpOOM.java:20)  


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

    【示例3-4】以下代码合计分配了25M内存空间。


     
    1. public class DumpOOM {  
    2.  public static void main(String[] args) {  
    3.  Vector v=new Vector();  
    4.   for(int i=0;i<25;i++)  
    5.    v.add(new byte[1*1024*1024]);  
    6.  }  
    7. }  



     使用如下参数执行上述代码:

    -Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump

    显然20M堆空间不足以容纳25M内存,系统比如发生内存溢出,在发生错误后,控制台输出如下:


    1. java.lang.OutOfMemoryError: Java heap space  
    2. Dumping heap to d:/a.dump …  
    3. Heap dump file created [23067302 bytes in 0.160 secs]  
    4. Exception in thread “main” java.lang.OutOfMemoryError: Java heap space  
    5. at geym.zbase.ch3.heap.DumpOOM.main(DumpOOM.java:19)  


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

    jvm1

    除了在发生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虚拟机》一书Q交流群:397196583

  • 相关阅读:
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    软件工程实践总结
  • 原文地址:https://www.cnblogs.com/love-jishu/p/4386437.html
Copyright © 2011-2022 走看看