“Eclipse Memory Analyzer(MAT)分析JVM堆转储文件”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (建立内容为“独立包下载地址: https://eclipse.dev/mat/download/”的新页面) |
Jihongchang(讨论 | 贡献) |
||
(未显示同一用户的5个中间版本) | |||
第1行: | 第1行: | ||
− | + | ==== 独立包下载地址 ==== | |
+ | https://eclipse.dev/mat/download/ | ||
+ | |||
+ | 最新版的会要求比较高版本的JDK | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== 历史版本目录 ==== | ||
+ | https://eclipse.dev/mat/download/previous/ | ||
− | https://eclipse. | + | |
+ | |||
+ | ==== 实测 1.8 版本支持 JDK8 ==== | ||
+ | https://archive.eclipse.org/mat/1.8/rcp/MemoryAnalyzer-1.8.0.20180604-win32.win32.x86_64.zip | ||
+ | |||
+ | |||
+ | === 一些概念 === | ||
+ | |||
+ | ==== shallow heap,浅堆 ==== | ||
+ | 指的是一个对象本身所占用的内存大小,不包含该对象引用的其他对象所占用的内存。每个对象在内存中都有其自身的开销,这包括对象头信息(用于存储对象的元数据,如哈希码、锁状态等)、实例变量所占用的空间等。 | ||
+ | |||
+ | |||
+ | 示例说明: | ||
+ | |||
+ | 假设我们有以下简单的 Java 类:<syntaxhighlight lang="java"> | ||
+ | class Address { | ||
+ | String street; | ||
+ | String city; | ||
+ | int zipCode; | ||
+ | } | ||
+ | |||
+ | class Person { | ||
+ | String name; | ||
+ | int age; | ||
+ | Address address; | ||
+ | } | ||
+ | </syntaxhighlight>当创建一个 <code>Person</code> 对象时:<syntaxhighlight lang="java"> | ||
+ | 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; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * <code>Person</code> 对象的浅堆大小:只包含 <code>Person</code> 对象自身的实例变量(<code>name</code>、<code>age</code>、<code>address</code> 引用)以及对象头信息所占用的内存,不包含 <code>name</code> 引用的 <code>String</code> 对象、<code>address</code> 引用的 <code>Address</code> 对象所占用的内存。 | ||
+ | * <code>Address</code> 对象的浅堆大小:只包含 <code>Address</code> 对象自身的实例变量(<code>street</code>、<code>city</code>、<code>zipCode</code>)以及对象头信息所占用的内存,不包含 <code>street</code> 和 <code>city</code> 引用的 <code>String</code> 对象所占用的内存。 | ||
+ | |||
+ | |||
+ | ==== retained heap,保留堆 ==== | ||
+ | 指的是当一个对象被垃圾回收器回收时,能够被释放的内存总量。这一内存总量不仅包含该对象自身的浅堆(Shallow Heap)大小,还涵盖了该对象直接或间接引用的所有对象的浅堆大小之和。换句话说,保留堆反映了该对象在堆中实际占用的内存空间,也就是该对象及其依赖对象所占据的内存总和。 |
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)大小,还涵盖了该对象直接或间接引用的所有对象的浅堆大小之和。换句话说,保留堆反映了该对象在堆中实际占用的内存空间,也就是该对象及其依赖对象所占据的内存总和。