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

时间:2011-07-04 14:59:04

标签: java profiling

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

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

但这可以通过相反的方式完成 - 计算现有集合的大小(不用反射,字段大小等)吗?我知道将序列序列化为字节流并测量输出大小是行不通的,因为序列化不会反映确切的对象内存布局。但也许有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

如果您使用像YourKit这样的探查器,它可以告诉您物体的深度。你可以使用Instrumentation.getObjectSize()但它真的很难用(而且它只给你很浅的尺寸)

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