简单的愚蠢问题。我有一个包含java对象的集合。这些对象不是同一个类的实例,但是它们实现了相同的接口,并且在概念上非常“相似”,因此它们的大小应该非常相似。我需要了解这个集合在内存中占用多少空间。计算它的最简单(最好)方法是什么?
我知道我可以把每个可以驻留在集合中的java类,计算它们的大小(深度,反射等),得到平均值,乘以N(集合大小)并得到最终值。
但这可以通过相反的方式完成 - 计算现有集合的大小(不用反射,字段大小等)吗?我知道将序列序列化为字节流并测量输出大小是行不通的,因为序列化不会反映确切的对象内存布局。但也许有其他方法可以做到这一点?
答案 0 :(得分:1)
如果您使用像YourKit这样的探查器,它可以告诉您物体的深度。你可以使用Instrumentation.getObjectSize()但它真的很难用(而且它只给你很浅的尺寸)
最好的方法可能是自己估算/计算。将每个字段的大小(向上舍入到接下来的8个字节)相加,每个对象增加12个字节的开销,如果使用的是64位JVM,则会增加16个字节,并且压缩Oops已关闭。