11

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

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

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

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

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

谢谢

4

3 回答 3

4

使用Instrumentation 包的getObjectSize()方法。

在这里查看实现细节:

于 2010-10-21T00:48:57.330 回答
2

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

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

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

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

于 2010-10-21T00:59:38.500 回答
2

您可能对我不久前写的一篇关于如何计算 Java 对象的内存使用量的文章感兴趣。诚然,它主要针对 32 位 Hotspot,尽管其中大部分本质上适用于其他环境。

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

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

于 2010-10-21T02:28:44.057 回答