对象的保留大小不等于它引用的所有对象的保留大小。
这是正在发生的事情:
- 使用 YourKit 捕获内存快照。
- 单击对象并按类类型显示实例
- 假设实例的保留内存是 A 字节(600mb)
- 扩展并汇总基础实例的保留大小假设总和为 B (300mb)
A >> B
对象的保留大小不等于它引用的所有对象的保留大小。
这是正在发生的事情:
A >> B
让我给你举个例子。
首先,您需要了解什么是保留大小。从官方文档:
对象的保留大小是它的浅层大小加上只能从该对象直接或间接访问的对象的浅层大小。换句话说,保留大小表示垃圾收集器在收集此对象时将释放的内存量。
在一个简单的对象的保留大小确实是它所引用的对象的总和。下图中 Obj1 的保留大小是 Obj1 浅层大小与 Obj2 和 Obj3 保留大小之和:
在更复杂的参考模型中情况并非如此。如果 Obj6 开始引用 Obj5,则 Obj5 将不能仅从 Obj2 访问。因此 Obj2 的保留大小现在将仅包括 Obj4,并且将排除 Obj5。 Obj1 的保留大小将保持不变。如果垃圾收集器释放 Obj1,它将释放大小为 41 的整个引用图。但是,如果垃圾收集器仅释放 Obj2,它不会释放 Obj5,因为它仍会被 Obj6 引用。