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

时间:2014-05-29 19:44:46

标签: java memory-management performance-testing yourkit

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

以下是发生的事情:

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

1 个答案:

答案 0 :(得分:4)

让我举个例子。

首先,您需要了解保留的大小。 来自官方documentation

  物体的

保留尺寸是浅尺寸加上浅尺寸   直接或间接访问的对象,仅来自   这个对象。换句话说,保留的大小代表金额   在此对象时将由垃圾收集器释放的内存   收集。

简单来说,对象的保留大小确实是它所引用的对象的总和。在下图中,Obj1的保留大小是Obj1浅层大小和Obj2和Obj3保留大小的总和: simple case

在更复杂的参考模型中并非如此。如果Obj6开始引用Obj5,则只能从Obj2访问Obj5。因此,Obj2的保留大小现在仅包括Obj4,并将排除Obj5。 retained size of Obj1 is not a sum of Obj2 and Obj3 Obj1的保留大小将保持不变。如果垃圾收集器释放Obj1,它将释放大小为41的整个引用图。 但是,如果垃圾收集器只释放Obj2,它将不会释放Obj5,因为它仍然会被Obj6引用。