YourKit-对象的保留大小不等于其引用的所有对象的保留大小

hba*_*hba 6 java memory-management yourkit performance-testing

对象的保留大小不等于其引用的所有对象的保留大小。

这是正在发生的事情:

  1. 使用YourKit捕获内存快照。
  2. 单击对象并按类类型显示实例
  3. 假设实例的保留内存为A字节(600mb)
  4. 扩展并求和基础实例的保留大小,假设总和为B(300mb)

A >> B

Soi*_*oid 8

让我给你举个例子。

首先,您需要了解什么是保留大小。从官方文档中

对象的保留大小是其浅大小加上只能从该对象直接或间接访问的对象的浅大小。换句话说,保留的大小表示垃圾回收器在收集此对象时将释放的内存量。

简单地说,对象的保留大小实际上就是该对象引用的对象的总和。在下面的图片中,Obj1的保留大小是Obj1浅大小以及Obj2和Obj3保留大小的总和: 简单的情况

在更复杂的引用模型中则不是这种情况。如果Obj6开始引用Obj5,则只能从Obj2访问Obj5。因此,保留的Obj2大小现在将仅包括Obj4,并将不包括Obj5。 Obj1的保留大小不是Obj2和Obj3的总和 Obj1的保留大小将保持不变。如果垃圾收集器释放了Obj1,则将释放大小为41的整个引用图。但是,如果垃圾收集器仅释放了Obj2,则不会释放Obj5,因为Obj6仍会引用它。