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

    从今天開始。我会发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)

    一旦发生这类问题。系统就会被迫退出。假设发生在生产环境。可能会引起严重的业务中断。

    为了能够不断改善系统,避免或降低这类错误的发生,须要在错误发生时,获得尽可能多的现场信息,以帮助研发人员排查现场问题。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等工具打开该文件进行分析,如图所看到的。能够非常easy地找到这些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

  • 相关阅读:
    actionscript3.0 的一些小技巧
    Flash 安全沙箱的意义
    明明连上了网,但是打不开网页
    关于电脑上可用内存太小的问题
    AS3 Starling 学习杂谈 (一) Quad类
    更新flash builder4,6 的AIR版本
    软件工程实践2017第二次作业
    软件工程实践2017第一次作业
    微信小程序开发指南合集 各类组件用法技巧
    微信小程序视频教程合集 附带源码、PPT下载
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6832360.html
Copyright © 2011-2022 走看看