诊断内存泄漏-实战

举报
Nick Qiu 发表于 2021/03/25 23:25:56 2021/03/25
【摘要】 前言 有8总内存泄漏,详细可以建该文 8 types of OutOfMemoryError. 其中5种OutOfMemoryError 发生在JVM heap,他们分别是: Java heap space GC overhead limit exceeded Requested array size exceeds VM limit Permgen space Metas...

前言

有8总内存泄漏,详细可以建该文 8 types of OutOfMemoryError. 其中5种OutOfMemoryError 发生在JVM heap,他们分别是:

  1. Java heap space
  2. GC overhead limit exceeded
  3. Requested array size exceeds VM limit
  4. Permgen space
  5. Metaspace

剩下3种OutOfMemoryError发生在heap外。

  1. Unable to create new native thread
  2. Kill process or sacrifice child
  3. 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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。