Eclipse Memory Analyzer(MAT)分析JVM堆转储文件

来自姬鸿昌的知识库
Jihongchang讨论 | 贡献2025年3月9日 (日) 02:19的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

独立包下载地址

https://eclipse.dev/mat/download/

最新版的会要求比较高版本的JDK



历史版本目录

https://eclipse.dev/mat/download/previous/


实测 1.8 版本支持 JDK8

https://archive.eclipse.org/mat/1.8/rcp/MemoryAnalyzer-1.8.0.20180604-win32.win32.x86_64.zip


一些概念

shallow heap,浅堆

指的是一个对象本身所占用的内存大小,不包含该对象引用的其他对象所占用的内存。每个对象在内存中都有其自身的开销,这包括对象头信息(用于存储对象的元数据,如哈希码、锁状态等)、实例变量所占用的空间等。


示例说明:

假设我们有以下简单的 Java 类:

class Address {
    String street;
    String city;
    int zipCode;
}

class Person {
    String name;
    int age;
    Address address;
}

当创建一个 Person 对象时:

Person person = new Person();
person.name = "John";
person.age = 30;
person.address = new Address();
person.address.street = "123 Main St";
person.address.city = "Anytown";
person.address.zipCode = 12345;
  • Person 对象的浅堆大小:只包含 Person 对象自身的实例变量(nameageaddress 引用)以及对象头信息所占用的内存,不包含 name 引用的 String 对象、address 引用的 Address 对象所占用的内存。
  • Address 对象的浅堆大小:只包含 Address 对象自身的实例变量(streetcityzipCode)以及对象头信息所占用的内存,不包含 streetcity 引用的 String 对象所占用的内存。


retained heap,保留堆

指的是当一个对象被垃圾回收器回收时,能够被释放的内存总量。这一内存总量不仅包含该对象自身的浅堆(Shallow Heap)大小,还涵盖了该对象直接或间接引用的所有对象的浅堆大小之和。换句话说,保留堆反映了该对象在堆中实际占用的内存空间,也就是该对象及其依赖对象所占据的内存总和。