我正在计算java对象[hashmap]的大小[使用的内存]。它包含[在运行时]不同数据类型的元素,因此[no-of-elem * size-of-element]并不是一种好方法。该代码现在通过一系列
来完成if (x)
do something
else if (primitives)
lookup size and calculate
然而,这个过程是CPU占用并且效率低下。
我正在考虑采用以下两种方法:
我正在寻找任何人在使用这些方法时获得性能,效率,缩放等方面的经验,或者如果你有更好的方法,那么我们正在寻找。
P.S: 这是我正在构建的后台实用程序,因此大小不需要超级准确,尽管它应该是正确的。所以我愿意交易准确性
我对深度尺寸不感兴趣[不会计算此对象引用的对象的大小。]
我正在寻找性能比较并理解getObjectSize()如何在内部工作..所以我不会搞砸其他东西以提高性能
由于
答案 0 :(得分:4)
使用Instrumentation包的getObjectSize()方法。
查看here了解实施细节:
答案 1 :(得分:2)
序列化的大小绝对不是要走的路,原因有两个:
如果您需要更好的性能,那么这实际上取决于对象的分布。一种可能性是对地图中的值进行随机抽样,确定平均值并根据此值计算估算值。
有关如何在散列图中查找随机值的建议,请参阅此question。
答案 2 :(得分:2)
您可能对我之前在how to calculate the memory usage of a Java object上写过的文章感兴趣。它被认为主要针对32位热点,尽管其中大部分都适用于其他环境。
您也可以从同一网站下载一个简单的agent for measuring Java object size,这将为您完成一些艰苦的工作,并且应该在64位环境中工作。
请注意,我想其他人提到对象的序列化形式与其在内存中的形式不同,因此如果要准确测量内存占用,则使用序列化是不合适的。