Java YourKit-对象的保留大小不';t等于它引用的所有对象的保留大小

Java YourKit-对象的保留大小不';t等于它引用的所有对象的保留大小,java,memory-management,performance-testing,yourkit,Java,Memory Management,Performance Testing,Yourkit,对象的保留大小不等于它引用的所有对象的保留大小 以下是正在发生的事情: 使用工具包捕获内存快照 单击对象并按类类型显示实例 假设实例的保留内存为A字节(600mb) 对基础实例的保留大小进行扩展和求和,假设总和为B(300mb) 让我给你举个例子 首先,您需要了解什么是保留大小。 官员说: 对象的保留大小是其浅尺寸加上浅尺寸 可直接或间接访问的对象的 这个物体。换句话说,保留的大小表示数量 当此对象 收集 在一个简单的例子中,一个对象的保留大小实际上是它引用的对象的总和。下图中,Obj1的保留尺

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

以下是正在发生的事情:

  • 使用工具包捕获内存快照
  • 单击对象并按类类型显示实例
  • 假设实例的保留内存为A字节(600mb)
  • 对基础实例的保留大小进行扩展和求和,假设总和为B(300mb)

  • 让我给你举个例子

    首先,您需要了解什么是保留大小。 官员说:

    对象的保留大小是其浅尺寸加上浅尺寸 可直接或间接访问的对象的 这个物体。换句话说,保留的大小表示数量 当此对象 收集

    在一个简单的例子中,一个对象的保留大小实际上是它引用的对象的总和。下图中,Obj1的保留尺寸是Obj1浅尺寸、Obj2和Obj3保留尺寸的总和:

    在更复杂的引用模型中,情况并非如此。如果Obj6开始引用Obj5,则Obj5将无法仅从Obj2访问。因此,Obj2的保留大小现在只包括Obj4,不包括Obj5。 Obj1的保留大小将保持不变。如果垃圾收集器释放Obj1,它将释放大小为41的整个引用图。
    然而,如果垃圾收集器仅释放Obj2,它将不会释放Obj5,因为它仍然会被Obj6引用。

    B>>A将是一个真正的谜。我猜是对齐还是元数据,但我不知道。我希望得到A~=B(几乎相同)的好答案。这似乎使得堆转储有时难以读取。在第二个示例中,Obj5不包括在Obj2或Obj3的保留大小中;它仅包含在Obj1的保留尺寸中。在一个复杂的堆转储中,Obj5可以嵌套在许多层的深处。在调查内存泄漏时,您对如何处理这个问题有什么建议吗?