1. 内存分析中的关键指标:Shallow Size与Retained Size
在Android应用性能优化领域,内存分析是最具挑战性的任务之一。作为一名长期奋战在一线的开发者,我发现许多同行在面对Memory Profiler工具时,往往会被Shallow Size和Retained Size这两个专业术语困扰。理解它们的区别,就像医生需要分清"症状"和"病因"一样重要。
Shallow Size(浅堆大小)相当于对象的"体重",仅表示这个对象实例本身占用了多少内存空间。而Retained Size(保留堆大小)则像是这个对象的"家族总资产",包含了它以及它独占的所有子对象占用的内存总和。举个例子,一个Person对象可能有50字节的Shallow Size(包含姓名、年龄等基本字段),但如果它持有一个10MB的图片引用,且这张图片没有被其他对象引用,那么它的Retained Size就是10MB+50字节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Shallow Size深度解析
2.1 底层内存构成
Shallow Size的计算在JVM层面有着精确的规范。一个典型的Java对象在内存中由三部分组成:
-
对象头(Object Header):通常占用12字节(32位系统)或16字节(64位系统),包含:
- Mark Word(8字节):存储哈希码、GC年龄、锁状态等信息
- Klass Pointer(4/8字节):指向类元数据的指针
-
实例数据(Instance Data):
- 基本类型:int(4字节)、boolean(1字节)等
- 引用类型:每个引用占用4字节(32位)或8字节(64位)
-
对齐填充(Padding):JVM要求对象大小必须是8字节的整数倍,不足部分会填充
例如一个简单的Activity子类:
java复制class MyActivity extends Activity {
private int count; // 4字节
private boolean flag; // 1字节
private TextView view; // 4/8字节(引用)
}
在32位系统下,其Shallow Size计算为:
code复制
