【问题标题】:YourKit - The retained size of an object doesn't equal the retained size of all the objects referred by itYourKit - 对象的保留大小不等于它引用的所有对象的保留大小
【发布时间】:2014-07-19 10:50:17
【问题描述】:

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

这是正在发生的事情:

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

A >> B

【问题讨论】:

  • B >> A 将是一个真正的谜。我在猜测对齐方式或元数据,但我不知道。
  • 嗯,我希望 A ~= B(几乎一样)

标签: java memory-management performance-testing yourkit


【解决方案1】:

让我举个例子。

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

对象的

保留大小是其浅层大小加上浅层大小 只能直接或间接访问的对象 这个对象。换句话说,保留的大小代表了数量 当此对象时,垃圾收集器将释放的内存量 被收集。

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

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

【讨论】:

  • 好答案。这似乎使堆转储有时难以阅读。在您的第二个示例中, Obj5 不包含在 Obj2 或 Obj3 的保留大小中;它仅包含在 Obj1 的保留大小中。在复杂的堆转储中,Obj5 可以嵌套很多层。在调查内存泄漏时,您对处理这个问题有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2021-08-21
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多