MAT分析JVM DUMP时的两个时常被错误理解的误区

  1. Shallow中的数据并不是有多少,占多少。而是在64位JVM DUMP中16个字节起步,然后8个字节的倍数增加,你会发现1个byte字段和2个byte字段都是站16个字节,到5个byte字段时占24个字节,其中16个字节起步中还有隐藏的占用开销。这么做是为了字节对齐,64位下是8字节的倍数,32位下是4字节的倍数。这也引入一个问题,一个int在32位和在64位下分别占用多少内存。我倾向于基础类型占用字节数都是一定的,但是如果需要字节对齐时,会有冗余的空间,这部分冗余空间不会算在基础类型上,而是算在对象上的。由于字节对齐的关系,小对象在64位上比在32位中更浪费内存。
  2. Retained中的具体数据是什么理解很重要,很多人误以为一个对象的Retained就是它所关联,或者牵引住的对象,这种理解本身就是一种错误。C可以被A牵引,C也可以被B牵引,那么当计算Retained时,C到底是算到A的Retained上还是算到B的Retained上呢?如果用一个对象Retained的就是它所关联,或者牵引住的对象来解释根本无法解释通,因为观察到的结果是C既不算到A的Retained也不会算到B的Retained上。正确的理解是一个对象的Retained是在GC时,这个对象能够释放的内存空间(对象集合)。选择AB后Show Retained Set可以看到这时C才算到Retained里。
时间: 2024-08-04 22:09:33

MAT分析JVM DUMP时的两个时常被错误理解的误区的相关文章

利用MAT分析JVM内存问题,从入门到精通(二)

上一篇文章MAT入门到精通(一)介绍了MAT的使用场景和基本概念,这篇文章开始介绍MAT的基本功能,后面还有两篇,一篇是MAT的高级功能,另一篇是MAT实战案例分析. 三.欢迎页 使用MAT打开一个heap dump文件,解析完成后,默认会进入欢迎页,欢迎页里包含了一些常见的分析:最大内存占用分析.常见的分析动作.常用的分析报告.MAT使用教程等等. 我们看下下面这张图,可以看出MAT的主要结构和功能: inspector:透视图,用于展示一个对象的详细信息,例如内存地址.加载器名称.包名.对象

Analyzer tool(MAT)分析JVM内存泄露案例

1.监控目的 2.常用分析工具 3.分析案例-MATMAT 介绍及分析:启动MAT, 然后选择菜单项 File- Open Heap Dump 来加载需要分析的堆转储文件.文件加载完后,可以看到如图 1所示的界面:从图1可以看到他的大部分功能:? Histogram 可以列出内存中的对象,对象的个数及大小? Dominator Tree 可以列出哪个线程以及线程执行的哪些对象占用空间? Top consumers 通过图形列出最大的object? Leak Suspects 通过MA自动分析泄漏

eclipse MAT分析heap dump

官方参考文档:http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fanalyzingthreads.html 代码 /** * -XX:+PrintGC -Xloggc:gc.log * * VM args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError */ public class HeapOOM { static class OO

JVM运行时数据区域分析

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁. 原文链接:http://sparkyuan.me/2016/04/22/JVM运行时数据区域/ ,转载请注明出去 程序计数器(PC) 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码行号指示器. - 当前线

使用Mat分析大堆信息

在定位一线问题时经常碰测试中出现Out Of Memory的问题, 通过jmap查看,发现JVM heap全用满了.有很多工具可以查看JVM堆的信息, 收费的比如JProfiler, YourKit,免费的如Oracle JDK自带的visualvm, jhat和Eclipse MAT.这个应用安装在一台AWS上,没有图形界面, 内存也比较小,想通过VNC远程桌面启动visualvm或者MAT不可能,通过jhat分析dump出来的snapshot(大约4.3G)也很慢,半天没有分析完毕,这种办法

如何抓取分析Thread Dump

一.抓取 1. ps –ef  | grep java 2. jstack -l <pid> > 111.txt 二.分析 jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注)  执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monitor entry(重点关注) 暂停,Suspended 对象等待中,Object.wait() 或 TI

在Eclipse中使用MAT分析Android程序内存使用状况(转)

对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题是一件很有难度的工作,一般都是由团队中的资深工程师负责,而且随着程序代码量的提高,难度还会逐步加大. 今天要介绍一个在Eclipse中使用的内存分析工具——MAT(Eclipse Memory Analyzer,主页在http://www.eclipse.org/mat/).它是一个功能非常丰富的J

[转]JVM运行时内存结构

目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的JVM参数 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描.而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会

Jconsole与Jmx 分析JVM状况(上) 转

出处:Jconsole与Jmx 分析JVM状况(上) JVM 平台提供 Mbeans 说明 在 Java 2 平台 5.0 以上版本,有一组 API 可以让 Java 应用程序和允许的工具监视和管理 Java 虚拟机( JVM)和虚拟机所在的本机操作系统.该组 API 在 java.lang.management .可以通过这些 API 可以监控 local端 JVM ,同时也可以监控远端 JVM Java 平台提供了如下一些接口用于管理 JVM 平台 ClassLoadingMXBean Ja