诊断内存泄漏-实战
前言
有8总内存泄漏,详细可以建该文 8 types of OutOfMemoryError. 其中5种OutOfMemoryError 发生在JVM heap,他们分别是:
- Java heap space
- GC overhead limit exceeded
- Requested array size exceeds VM limit
- Permgen space
- Metaspace
剩下3种OutOfMemoryError发生在heap外。
- Unable to create new native thread
- Kill process or sacrifice child
- reason stack_trace_with_native_method
诊断JVM heap内的5种OutOfMemoryErrors 的方法相同,我们将会在本文中介绍如何去诊断该问题;
工具
本文推荐2个工具来诊断内存泄漏:
1. GCeasy
GCeasy是一个万能的垃圾回收日志分析器,它可以从日志中检测内存问题;它是一个在线工具,你不需要下载安装。
2. Eclipse MAT
Eclipe MAT是一个强大的JVM heap文件分析工具。虽然市面上有多重类似工具,但是依据笔者经验,MAT使用效果最好,特别是当处理SIZE比较大的 HEAP dump文件,你可以从这个 页面上下载MAT. 这里有一些 Eclipse MAT tit-bits 帮助您在生成环境中使用该工具.
操作步骤
下面是内存诊断的操作步骤
Step 0: 验证是否有内存泄漏
操作的第一步我们需要确定程序中是否真的有内存泄漏,为了确定该事项,我们需要做如下2步;
- 使能如下JVM参数 吗,使能GC日志文件
-XX:+PrintGCDetails -XX:+PrintGCDateSamps -Xloggc:<GC-log-file-path>
- 上传日志回收文件到 GCEasy. 该软件会帮我们指出是否有内存泄漏.
如果确定有内存泄漏,则执行下一步,否则你的应用面临的不是内存泄漏;
Step 1: 捕获heap dump基线
一个heap dump是java进程的内存的一个快照,快照包含了在特定时间点时的JAVA对象、类的相关信息。
你需要在应用还处于健康状态的时候获取快照,通常内存泄漏发生在应用启动几分钟以至于几小时之后,因此启动应用10~15分钟之后,我们可以获取这个基准heap dump;
这里有一个关于 捕获 heap dump的说明.
建议在生产环境中做该操作,这样更容易发现问题;
Step 2: 获取出问题时候的heap dump
让应用执行,直到遇到内存问题。通常内存问题都会有引起以下特征,读者可以遇到以下问题时,做该操作:
- CPU 利用率变得很高
- 应用不能访问
- “java.lang.OutOfMemoryError”日志中看到这个错误;
任何以上问题发生的时候,捕获堆数据;
Step 3: 做heap dumps的比较分析
使用Eclipse MAT打开第一步生成的heap dump ,分析内存。通常情况下,最高的5个对象占据着大部分内存,也是导致内存泄漏的原因;
使用Eclipse MAT打开第二步生成的heap dump,注意最高的五个对象,如果他们中任何一个数量明显增加,那么它就很可能是导致内存泄漏的原因. Eclipse MAT 可以帮助查看这些对象在什么地方引用,我们可以这样看出是哪个对象,方法乃至代码行有内存泄漏问题;
文章来源: www.jianshu.com,作者:Nick_4438,版权归原作者所有,如需转载,请联系作者。
原文链接:www.jianshu.com/p/dc2c864c99eb
- 点赞
- 收藏
- 关注作者
评论(0)