计算Java对象的字节大小

时间:2010-10-21 00:23:15

标签: java serialization instrumentation

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

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

然而,这个过程是CPU占用并且效率低下。

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

  1. 将对象序列化为缓冲区并获取大小。
  2. 查看java.lang.instrument以获取大小
  3. 我正在寻找任何人在使用这些方法时获得性能,效率,缩放等方面的经验,或者如果你有更好的方法,那么我们正在寻找。

    P.S: 这是我正在构建的后台实用程序,因此大小不需要超级准确,尽管它应该是正确的。所以我愿意交易准确性

    我对深度尺寸不感兴趣[不会计算此对象引用的对象的大小。]

    我正在寻找性能比较并理解getObjectSize()如何在内部工作..所以我不会搞砸其他东西以提高性能

    由于

3 个答案:

答案 0 :(得分:4)

使用Instrumentation包的getObjectSize()方法。

查看here了解实施细节:

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:2)

您可能对我之前在how to calculate the memory usage of a Java object上写过的文章感兴趣。它被认为主要针对32位热点,尽管其中大部分都适用于其他环境。

您也可以从同一网站下载一个简单的agent for measuring Java object size,这将为您完成一些艰苦的工作,并且应该在64位环境中工作。

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