JVM(4)之 使用MAT排查堆溢出
接下来讲解如何设置以及当发生堆溢出的时候怎么排查问题。先看一小段代码:
代码中使用了一个无限循环来为list添加对象,如果采用默认的堆大小的话可能要等待好久才能出现堆溢出的错误,因此我们要将其设置小一点:
-Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError,elipse中的设置方法我们在第一章讲过了,这里不多说啦。-Xms10m,意思就是堆的最小内存为10m。同理-Xmx10m的意思就是最大内存也为10m。这两个都是设置为10m,那么堆的大小就是10m。而-XX:+HeapDumpOnOutOfMemoryError指的是当发生内存溢出的时候会将当前的内存使用情况生成一个快照保存起来,但需要eclipse下载一个MAT的插件,下载方式度娘到处都是。
使用刚刚设置的参数启动程序,稍等一小会就会出现以下错误:
显示出堆溢出错误,并且生成了一个叫做java_pid4792.hprof的文件,我们刷新项目便可以看到该文件,双击打开,需要一段的加载时间。
首先可以看到的是一个饼状图,占用部分最大的便是发生溢出错误的部分,我们接着往下看 :
我们这里看看画红线的部分,这里列出一些存活的大对象,在溢出的时候一般先怀疑大对象,我们点进去:
这里列出占用内存最大的几个对象,很显然,第一个很可疑,占用率达到了94.64%!继续跟进:
发现都是test对象,因此排查的时候可以从这个方面下手。接着我们右键该对象选择Path To GC Root(在引用链上的路径),再选择exclue all phantom/weak/soft etc. reference ,结果如图:
可以看到他是被List引用了,因此一直在引用链上,导致无法被回收掉,也就出现了内存溢出。
最新文章
- python 生成器等语法
- ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)
- pythony语法小练习
- Android 播放在线视频
- [算法导论]强连通分量 @ Python
- A trip through the Graphics Pipeline 2011_02
- Oracle基础 (十四)其他函数
- HTML输出 二 控制行背景颜色
- iOS之手势滑动返回功能-b
- 《scraping with python》
- 2015 多校联赛 ——HDU5302(矩阵快速幂)
- 介绍一款文档神器:pandoc
- eclipse经常出现——未响应!!!
- hide server info
- [译] 玩转ptrace (一)
- web开发中的跨域整理
- Arcgis Runtime for andriod 100 加载TPK
- 【js】正则表达式(I)
- Codeforces Round #418 (Div. 2)D
- 1、Semantic-UI之开发环境搭建