JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式
JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式,以及如何使用Eclips Memory Analyzer(MAT)插件进行堆内存分析。
方法一:
jmap -dump:format=b,file=文件名 [pid]
例如:
jmap -dump:format=b,file=/usr/local/base/02.hprof 12942
方法二:
让JVM在遇到OOM(OutOfMemoryError)时生成Dump文件,需要配置一些信息
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/base
比如:我用eclipse配置一下。如下图所示:
方法三:
使用 jcmd 命令生成 dump 文件
jcmd <pid> GC.heap_dump d:\dump\heap.hprof
此方法没有经过博主的测试。
分析:
dump文件可以通过MemoryAnalyzer(MAT)分析查看,可以查看dump时对象数量,内存占用,线程情况等。
我们现在来安装一下eclipse MAT插件
打开Help -> new install software
名字可以随便起,插件地址:http://archive.eclipse.org/mat/1.3/update-site
剩下的就不做多的介绍了,安装完成后,我们来使用方法二来营造一个内存溢出的例子:
比如我写的Java内存溢出程序是:
import java.util.ArrayList; import java.util.List; public class OOM { public static void main(String[] args) { List<Object> list = new ArrayList<>(); // 创建n个1M大小的数组,耗尽内存 for (int i = 0; i < 10000; i++) { list.add(new byte[1024 * 1024]); } } }
控制台打印:
java.lang.OutOfMemoryError: Java heap space Dumping heap to /Users/sun/Documents/java_pid31782.hprof ... Heap dump file created [1943907998 bytes in 5.035 secs]
下边我们切换eclipse视图到 Memory Analysis,点击File -> Open Heap Dump,选择生成的hprof文件,如下图所示
打开完成后,如下所示:圈起来的这三个是常用的分析方式
现在我们点击 Leak Suspects 来看一下
点击 Histogram 来看一下
byte 数组创建的很大,溢出的问题一目了然
![](/img/my/wx.png)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Dubbo分析之Exchange层
系列文章 Dubbo分析Serialize层 Dubbo分析之Transport层 Dubbo分析之Exchange 层 Dubbo分析之Protocol层 前言 紧接着上文Dubbo分析之Transport层,本文继续介绍Exchange层,此层官方介绍为信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer;下面分别进行介绍 Exchanger分析 Exchanger是此层的核心接口类,提供了connect()和bind()接口,分别返回ExchangeClient和ExchangeServer;dubbo提供了此接口的默认实现类HeaderExchanger,代码如下: public class HeaderExchanger implements Exchanger { public static final String NAME = "header"; @Override public Excha...
- 下一篇
简单说说Kafka中的时间轮算法
零、时间轮定义 简单说说时间轮吧,它是一个高效的延时队列,或者说定时器。实际上现在网上对于时间轮算法的解释很多,定义也很全,这里引用一下朱小厮博客里出现的定义: 参考下图,Kafka中的时间轮(TimingWheel)是一个存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放一个定时任务列表(TimerTaskList)。TimerTaskList是一个环形的双向链表,链表中的每一项表示的都是定时任务项(TimerTaskEntry),其中封装了真正的定时任务TimerTask。 如果你理解了上面的定义,那么就不必往下看了。但如果你第一次看到和我一样懵比,并且有不少疑问,那么这篇博文将带你进一步了解时间轮,甚至理解时间轮算法。 如果有兴趣,可以去看看其他的定时器 你真的了解延时队列吗。博主认为,时间轮定时器最大的优点: 是任务的添加与移除,都是O(1)级的复杂度; 不会占用大量的资源; 只需要有一个线程去推进时间轮就可以工作了。 我们将对时间轮做层层推进的解析: 一、为什么使用环形队列 假设我们现在有一个很大的数组,专门用于存放延时任务。它的精度达到了毫秒级!那么我们的延...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 2048小游戏-低调大师作品