对象的内存使用情况

时间:2013-02-12 10:56:08

标签: java object memory space

如果我有一个物体,想要对物体的大小进行粗略估计,与其组件的大小相比,我可以这样做吗?

Object有一个int字段和一个float字段。所以该对象的空间使用量是对该对象的引用的大小(8)字节+两个原始值16 + 16的大小,这给了我40字节或25%的额外空间。

2 个答案:

答案 0 :(得分:4)

检查对象大致大小的一种方法是创建该对象的许多实例并检查内存之前和之后的内存。要获得更准确的数字,您可以使用特定的JVM参数:

-verbose:gc -XX:-UseTLAB
  • verbose:gc以确保在测量过程中没有GC发生
  • -XX:-UseTLAB要求JVM不要在块中分配内存(否则它会提高效率)。关闭该选项可以获得更准确和稳定的结果。

然后,您可以在分配前后调用Runtime.getRuntime().freeMemory();来监控内存使用情况。

请注意,添加字段不一定会增加内存使用量。例如,在热点7 64位上,一个对象占用内存中的16个字节,但向该对象添加int字段不会改变大小(即保持一个int字段的对象也是16该JVM上的字节)。这是由于内存对齐限制。

答案 1 :(得分:0)

您可以使用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()));
}

}