测量内存中java对象占用空间的最佳方法



一个愚蠢的问题。我有一个包含java对象的集合。这些对象不是同一类的实例,但它们实现了相同的接口,并且在概念上非常"相似",因此它们的大小应该非常相似。我需要大致了解这个集合将在内存中消耗多少空间。什么是最简单(最好(的计算方法?

我知道我可以取每个可以驻留在集合中的java类,计算它们的大小(深度大小、反射等(,得到平均值,乘以N(集合大小(,得到最终值。

但是,可以反过来做吗?计算现有集合的大小(而不必在反射、字段大小等方面进行细分(?我知道将集合序列化为字节流并测量输出大小是不起作用的,因为序列化不会反映确切的对象内存布局。但也许还有其他方法可以做到这一点?

如果您使用像YourKit这样的探查器,它可以告诉您对象的深度大小。你可以使用Instrumentation.getObjectSize((,但使用真的很痛苦(而且它只会给你带来很浅的尺寸(

最好的方法可能是自己估计/计算。将每个字段的大小相加(四舍五入到后面的8个字节(,每个对象增加12个字节的开销,如果使用64位JVM并且压缩Oops关闭,则增加16个字节。

相关内容

最新更新