计算Java对象的字节大小

我正在计算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以获取大小

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

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

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

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

谢谢

使用Instrumentation包的getObjectSize()方法。

在这里查看实施细节:

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

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

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

有关如何在散列映射中查找随机值的建议,请参阅此问题 。

您可能对我刚才写的关于如何计算Java对象的内存使用情况的文章感兴趣。 它被认为主要针对32位热点,尽管其中大部分都适用于其他环境。

您还可以从同一站点下载一个用于测量Java对象大小的简单代理,这将为您完成一些艰苦的工作,并且应该在64位环境中工作。

请注意,正如其他人所提到的那样,对象的序列化forms与其在内存中的forms不同,因此如果要准确测量内存占用,则不适合使用序列化。