【问题标题】:How is "Size" calculated in JVisualVM's Heap DumpJVisualVM 的堆转储中的“大小”是如何计算的
【发布时间】:2019-02-06 19:44:08
【问题描述】:

我正在运行 Java Visual VM 来分析 Mule 应用程序的性能,以减少使用的内存量。当我查看堆转储时,我看到 char[] 的大小超过 37 MB,String 的大小超过 28 MB。

我不清楚的是 size 列如何解释使用的内存量。特别是,由于 String 是 char[] 的抽象,我想知道这是否意味着 37 MB 的 char 数组中的一些也存在于 28 MB 的字符串中,或​​者它们是否是单独分配的。

除此之外,我还有一个我怀疑占用大量内存并包含多个字符串的类,但根据我的堆转储,这个类只使用了堆中总内存的 6.5%。

所以我想我的问题是......如果我要通过使用更少的 String 对象来提高我的自定义类的效率,我会看到 Strings 和 Char[]s 报告使用的内存量减少吗?还是只针对特定的课程?

谢谢!

【问题讨论】:

  • 大小仅包括对象本身的内存,不包括任何引用的对象(并且数组是对象)。您正在寻找的是“保留大小”; VisualVM 有显示它的选项,但它的计算可能需要一些时间,因为它必须找出是否有其他对同一对象的引用。
  • 非常感谢我需要知道的一切。谢谢!
  • IIRC jol 也可以得到一些物体的尺寸(深尺寸)

标签: java string memory-management mule visualvm


【解决方案1】:

我只需要 Holger 的评论...

“大小只包括对象本身的内存,不包括任何引用的对象(数组也是对象)。”

仅此一项就让我更好地了解如何进行优化。

【讨论】:

  • 当使用它们进行比较或查看最大块以确定内存消耗的杠杆时,这些值为优化提供了很好的提示。但值得知道shipilev.net/blog/2014/heapdump-is-a-lie 对这些值持保留态度。
  • @Holger 我喜欢关于shipilev,他不仅说-“嘿,这里有问题”,而且还试图解决它。那是他的一篇非常有名的文章,但他还创建了jol
猜你喜欢
  • 2012-08-31
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2011-04-26
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多