实战Java虚拟机之中的一个“堆溢出处理”
从今天開始。我会发5个关于java虚拟机的小系列:
- 实战Java虚拟机之中的一个“堆溢出处理”
- 实战Java虚拟机之二“虚拟机的工作模式”
- 实战Java虚拟机之三“G1的新生代GC”
- 实战Java虚拟机之四“禁用System.gc()”
- 实战Java虚拟机之五“开启JIT编译”
以下说说【实战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章。
除了在发生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
实战Java虚拟机之中的一个“堆溢出处理”的更多相关文章
- 实战Java虚拟机之一“堆溢出处理”
从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...
- vmware漏洞之一——转:利用一个堆溢出漏洞实现VMware虚拟机逃逸
转:https://zhuanlan.zhihu.com/p/27733895?utm_source=tuicool&utm_medium=referral 小结: vmware通过Backd ...
- 实战Java虚拟机之四:提升性能,禁用System.gc() ?
今天开始实战Java虚拟机之四:"禁用System.gc()". 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟 ...
- 实战Java虚拟机之三“G1的新生代GC”
今天开始实战Java虚拟机之三:“G1的新生代GC”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...
- 【Java】实战Java虚拟机之五“开启JIT编译”
今天开始实战Java虚拟机之五“开启JIT编译” 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Ja ...
- 实战Java虚拟机之二“虚拟机的工作模式”
今天开始实战Java虚拟机之二:“虚拟机的工作模式”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...
- 实战java虚拟机的学习计划图(看懂java虚拟机)
啥也不说了,实战java虚拟机,好好学习,天天向上!针对自己的软肋制定学习计划. 一部分内容看完,自己做的学习笔记和感想. 学java很简单,但懂java会有难度,如果你的工资还没超过1W,那是时候深 ...
- 学习实战java虚拟机的计划图
啥也不说了,实战java虚拟机,好好学习,天天向上! <实战java虚拟机>一书Q交流群:397196583
- 《实战Java虚拟机》,最简单的JVM入门书,京东活动,满200就减100了,该出手了
#京东满200—100单# 图书放血大卖了 <实战Java虚拟机>http://item.jd.com/11670385.html 参加京东满200减 100的大促,就在6.1这一天,仅此 ...
随机推荐
- HashMap深度解析(二)
本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/16890151,转载请注明. 上一篇比较深入的分析了HashM ...
- openstack 动态加载usb,需要修改kvm虚拟机的xml文件
一.利用libvirt命令动态挂载 在利用KVM的虚拟桌面应用中,有时候需要在虚拟桌面起来后还能够动态的挂载或卸载数据盘,以达到类似热插盘U盘或移动硬盘的效果,当然管理上需要做处理.如果纯粹中技术上来 ...
- nagios学习记录
这几天开始接触nagios,记录下学习的心得 监控机上需要安装nagios,nagios-plugins, nrpe 被监控机上需要安装nagios-plugins, nrpe nagios通过插件n ...
- mongodb权限管理(转)
Mongodb 预定义角色 Mongodb 中预定义了一些角色,把这些角色赋予给适当的用户上,用户就只能进行角色范围内的操作. 数据库用户角色 (所有数据库都有) read 用户可以读取当前数据库的数 ...
- javascript快速入门8--值,类型与类型转换
原始值和引用值 在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值. 原始值(primitive value)是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量 ...
- Vue生命周期各阶段发生的事情
首先,参考之前一篇vue生命周期的总结:Vue生命周期总结 接下来我们来分析下官方文档经典流程图,每个阶段到底发生了什么事情. 1.在beforeCreate和created钩子函数之间的生命周期 在 ...
- LogManager
public class LogManager { // Fields public static bool Debugstate; // Methods public static void Log ...
- 别样JAVA学习(六)继承下(2.3)异常下
1.RuntimeException Exception中有一个特殊的子类异常RuntimeException执行时异常. 假设在函数内容抛出该异常,函数上能够不用声明.编译一样通过. 假设在函数上声 ...
- Vue 进入/离开动画
1.示例代码 (注:写到vue单文件中了) <template> <div> <button v-on:click="show = !show"> ...
- 笛卡尔树 POJ ——1785 Binary Search Heap Construction
相应POJ 题目:点击打开链接 Binary Search Heap Construction Time Limit: 2000MS Memory Limit: 30000K Total Subm ...