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
对象自身的实例变量(name
、age
、address
引用)以及对象头信息所占用的内存,不包含name
引用的String
对象、address
引用的Address
对象所占用的内存。Address
对象的浅堆大小:只包含Address
对象自身的实例变量(street
、city
、zipCode
)以及对象头信息所占用的内存,不包含street
和city
引用的String
对象所占用的内存。
retained heap,保留堆
指的是当一个对象被垃圾回收器回收时,能够被释放的内存总量。这一内存总量不仅包含该对象自身的浅堆(Shallow Heap)大小,还涵盖了该对象直接或间接引用的所有对象的浅堆大小之和。换句话说,保留堆反映了该对象在堆中实际占用的内存空间,也就是该对象及其依赖对象所占据的内存总和。