【问题标题】:Calculating byte-size of Java object [duplicate]计算Java对象的字节大小[重复]
【发布时间】:2011-04-28 08:32:24
【问题描述】:

我正在计算 java 对象 [hashmap] 的大小 [memory used]。它包含不同数据类型的元素 [在运行时],因此 [ no-of-elem * size-of-element] 不是那么好的方法。现在的代码是通过一系列

if (x)
  do something
else if (primitives)
  lookup size and calculate

但是,此过程占用大量 CPU 且效率低下。

我正在考虑以下两种方法:

  1. 将对象序列化为缓冲区并获取大小。
  2. 查看 java.lang.instrument 以获取大小

我正在寻找任何人在性能、效率、扩展等方面有使用这些方法的经验,或者如果你知道任何更好的方法。

附注: 这是我正在构建的后台实用程序,因此大小不需要非常准确,尽管它应该是正确的。所以我愿意用准确性来换取性能

我对 deep-size 不感兴趣[不会计算此对象引用的对象的大小。]

我正在寻找性能比较并了解 getObjectSize() 在内部如何工作..这样我就不会为了提高性能而搞砸其他东西

谢谢

【问题讨论】:

  • 您所说的尺寸究竟是什么意思?占用的内存量?包含的元素数量?
  • 按大小,我的意思是占用的内存量.. 编辑以反映这一点
  • 或多或少相同的问题:stackoverflow.com/questions/757300/…

标签: java serialization instrumentation


【解决方案1】:

使用 Instrumentation 包的getObjectSize() 方法。

查看here了解实现细节:

【讨论】:

  • thnx .. 我正在寻找性能比较并了解 getObjectSize() 在内部是如何工作的 .. 这样我就不会搞砸其他东西来提高性能 // 虽然我认为 getObjectSize 是我的最佳选择.
【解决方案2】:

序列化大小绝对不是要走的路,原因有两个:

  • 在标准的 java 序列化中,可能会有相当多的开销,这会增加大小。
  • 不会比使用getObjectSize() 方法更快,我们可以假设它会遍历所有引用,并使用某种查找来确定对象的原始值/引用的大小。

如果您需要更好的性能,那么这实际上取决于您的对象的分布。一种可能是对地图中的值进行一些随机抽样,确定平均值并根据该值计算估计值。

有关如何在哈希图中查找随机值的建议,请参阅question

【讨论】:

  • Thnx..随机采样可能非常不准确,因为哈希图中的值在大小上可能会有很大差异。
【解决方案3】:

您可能对我不久前在how to calculate the memory usage of a Java object 上写的一篇文章感兴趣。诚然,它主要针对 32 位 Hotspot,尽管其中大部分本质上适用于其他环境。

您还可以从同一个站点下载一个简单的agent for measuring Java object size,这将为您省去一些繁重的工作,并且应该可以在 64 位环境中工作。

请注意,正如我认为其他人提到的,对象的序列化形式与其在内存中的形式不同,因此如果您想准确测量内存占用量,则不适合使用序列化。

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 2021-05-20
    • 2011-05-06
    • 2022-11-12
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多