简单的愚蠢问题。我有一个包含 java 对象的集合。这些对象不是同一类的实例,但它们实现相同的接口(interface)并且在概念上非常“相似”,因此它们的大小应该非常相似。我需要了解这个集合将在内存中消耗多少空间。计算该值的最简单(最佳)方法是什么?
我知道我可以获取可以驻留在集合中的每个java类,计算它们的大小(深度大小、反射等),获取平均值,乘以N(集合大小)并得到最终值。
但是可以用相反的方式来完成吗 - 计算现有集合的大小(无需深入研究反射、字段大小等)?我知道将集合序列化为字节流并测量输出大小将不起作用,因为序列化不会反射(reflect)确切的对象内存布局。但也许还有其他方法可以做到这一点?
最佳答案
如果您使用像 YourKit 这样的分析器,它可以告诉您对象的深度大小。您可以使用 Instrumentation.getObjectSize() 但使用起来确实很痛苦(而且它只能提供浅层大小)
最好的方法可能是自己估计/计算。将每个字段的大小相加(四舍五入到接下来的 8 个字节),每个对象增加 12 个字节的开销,如果您使用的是 64 位 JVM 并且“压缩 Oops”关闭,则增加 16 个字节。
关于java - 测量 Java 对象在内存中占用的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6573116/