登录 |  注册
首页 >  架构·案例 >  架构师学习之路-Java开发实战学习笔记 >  MAT如何查看老年代对象-内存泄漏分析

MAT如何查看老年代对象-内存泄漏分析

如何看到老年代、新生代的对象有哪些呢?

MAT是分析dump的神器(顺便吐槽:当然也是吃内存卡机器的怪兽)。通常我们会在出现 fullGC 时 dump下堆内存,然后分析FullGC的原因。那如何获知整个堆内存里,有哪些对象在新生代、哪些在老年代呢?

一个典型的应用场景是:出现了耗时超预期的YoungGC,我们使用 【jstat -gcutil PID 1000】(每秒采一个点) 观察 Eden区的使用情况,在Eden 即将用满时 手动执行 【 jmap -dump:format=b,file=heap.hprof 】触发 Heap dump。然后分析到底是哪些对象 进入了新生代,导致YoungGC耗时这么长的。

1. 利用指令jmap dump文件

JDK自带了一些工具可以帮助我们查看JVM运行的堆内存情况,常用的是jmap命令

jmap.png

jmap -heap <pid>  打印堆的使用情况

jmap打印堆的使用情况.png

那么,从这个输出中我们也可以大致看出堆的结构,分为Young Generation (年轻代) 和 Old Generation (老年代)

Young Generation又被划分为:Eden Space , From Space 和 To Space

可以看到这里To区是干净的,还未被使用,From区已经使用了95%了

jmap -histo[:live] <pid>  打印类的实例数量、占用的内存、类的名称,通常我们并不需要看所有的,只需要看前几条即可

jmap打印堆的使用情况2.png

jmap -dump:live,format=b,file=heap.bin <pid>  

以hprof二进制格式dump堆的使用情况(PS:相当于生成一个快照,后续我们可以对这个快照文件进行分析)

jmapdump.png

2.Memory Analyzer (MAT)

文件dump下来以后,可以使用Eclipse的MAT插件进行查看

如果日常开发用的是eclipse的话,可以直接安装这个插件,如果不是的话,这个插件也可以独立运行

https://www.eclipse.org/mat/

https://www.eclipse.org/mat/downloads.php

解压之后双击MemoryAnalyzer.exe即可运行, 导入刚才dump的文件,效果如下图:

导入mat文件.png

点击Leak Suspects(泄露疑点) , 可以查看内存泄漏的大对象有哪些

leak suspects.png

还有其他使用可以参考相关教程

3. 查看老年代对象有哪些

需要先查看老年代地址范围,可以使用./vjmap.sh -address PID 打印得到heap地址区间,(或查看gc日志)比如:

Heap after GC invocations=1044 (full 0):
 par new generation   total 1677760K, used 8859K [0x00000006c0000000, 0x0000000740000000, 0x0000000740000000)
  eden space 1258368K,   0% used [0x00000006c0000000, 0x00000006c0000000, 0x000000070cce0000)
  from space 419392K,   2% used [0x000000070cce0000, 0x000000070d586c68, 0x0000000726670000)
  to   space 419392K,   0% used [0x0000000726670000, 0x0000000726670000, 0x0000000740000000)
 concurrent mark-sweep generation total 2097152K, used 328368K [0x0000000740000000, 0x00000007c0000000, 0x00000007c0000000)
 Metaspace       used 162911K, capacity 173128K, committed 173312K, reserved 1202176K
  class space    used 19543K, capacity 21388K, committed 21504K, reserved 1048576K
}

根据打印信息得到老年代区间:从0x0000000740000000开始,0x00000007c0000000结束

 concurrent mark-sweep generation total 2097152K, used 328368K [0x0000000740000000, 0x00000007c0000000, 0x00000007c0000000)

打开MAT OQL窗口,输入如下语句,然后点击红色感叹号执行,最终效果如下图,即可看到老年代对象列表:

SELECT * FROM INSTANCEOF java.lang.Object t WHERE (toHex(t.@objectAddress) >= "0x740000000" AND toHex(t.@objectAddress) <= "0x7c0000000")

oql.png

根据对象大小和分布,再结合代码即可分析出内存泄漏的原因。

上一篇: 内存泄漏情况和示例 ( 出现FullGC内存泄漏问题排查和分析)
下一篇: Java 架构师读哪些书好
推荐文章
  •    目前支持I/O多路复用的系统调用有  select,pselect,poll,epoll,I/O多路复用就是 通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 但select,pselect,poll,epoll本质上都是
  • 架构师在进行系统设计时,遵循一套复杂且综合的方法论,主要包括以下核心步骤:需求分析:理解并明确业务需求是架构设计的第一步。架构师需要与各利益相关者深入沟通,收集和分析业务需求、性能需求、安全性需求、扩展性需求等。领域建模:基于需求分析,构建抽象的业务模型或数据模型,明确系统的边界、核心实体及其关系。
  • 根据阿里交易型业务的特点,以及在双十一这样业内罕有的需求推动下,我们在官方的MySQL基础上增加了非常多实用的功能、性能补丁。而在使用MySQL的过程中,数据一致性是绕不开的话题之一。本文主要从阿里巴巴“去IOE”的后时代讲起,向大家简单介绍下我们过去几年在MySQL数据一致性上的努力和实践,以及目
  • 随着深度学习在图像、语言、广告点击率预估等各个领域不断发展,很多团队开始探索深度学习技术在业务层面的实践与应用。而在广告CTR预估方面,新模型也是层出不穷:WideandDeep、DeepCrossNetwork、DeepFM、xDeepFM,美团很多篇深度学习博客也做了详细的介绍。但是,当
  • 1.背景搜索优化问题,是个典型的AI应用问题,而AI应用问题首先是个系统问题。经历近10年的技术积累和沉淀,美团搜索系统架构从传统检索引擎升级转变为AI搜索引擎。当前,美团搜索整体架构主要由搜索数据平台、在线检索框架及云搜平台、在线AI服务及实验平台三大体系构成。在AI服务及实验平台中,模型训练平台
  • 行业算法版简介OpenSearch-行业算法版是基于阿里巴巴自主研发的大规模分布式搜索引擎搭建的一站式智能搜索业务开发平台,目前为包括淘宝、天猫在内的阿里集团核心业务提供搜索服务支持。通过内置各行业的查询语义理解、机器学习排序算法等能力,提供充分开放的引擎能力,助力开发者快速搭建智能搜索服务。Ope
学习大纲