如果我有一个对象并且想要粗略估计对象的大小与其组件的大小相比,我可以这样做吗?
Object 有一个 int 字段和一个 float 字段。因此,该对象的空间使用量是对该对象的引用大小(8)字节 + 两个原始值 16+16 的大小,这使我需要 40 字节或 25% 的额外空间。
检查对象大致大小的一种方法是创建该对象的许多实例并检查前后的内存。要获得更准确的数字,您可以使用特定的 JVM 参数:
-verbose:gc -XX:-UseTLAB
verbose:gc
确保在测量过程中不发生 GC-XX:-UseTLAB
要求JVM不要以块的形式分配内存(否则它会这样做以提高效率)。关闭该选项可提供更准确和稳定的结果。Runtime.getRuntime().freeMemory();
然后,您可以通过在分配前后调用来监控内存使用情况。
请注意,添加字段并不一定会增加内存使用量。例如,在热点 7 64 位上,一个对象在内存中占用 16 个字节,但int
向该对象添加一个字段不会改变大小(即,保存一个int
字段的对象在该 JVM 上也是 16 个字节)。这是由于内存对齐限制。
您可以使用 java.lang.instrumentation 包:
http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html
它有一种方法可用于获取特定于实现的对象大小的近似值,以及与对象相关的开销。
谢尔盖链接的答案有一个很好的例子,我将在这里重新发布,但你应该已经从他的评论中看到了:
import java.lang.instrument.Instrumentation;
public class ObjectSizeFetcher {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}
使用 getObjectSize:
public class C {
private int x;
private int y;
public static void main(String [] args) {
System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
}
}