您可以通过很多相同的对象和测量所采取的内存做。我已经多次使用这种技术,并获得了稳定,可重复的结果。总的来说,
public static void main(String[] args) {
final Object[] a = new Object[10000];
final long startMem = memTaken();
for (int i = 0; i < a.length; i++) a[i] = new Object();
System.out.println((memTaken() - startMem)/a.length);
a.hashCode();
}
static long memTaken() {
final Runtime rt = getRuntime();
try {
rt.gc(); Thread.sleep(50);
rt.gc(); Thread.sleep(50);
} catch (InterruptedException e) {}
final long memTaken = rt.totalMemory() - rt.freeMemory();
System.out.println("Mem taken " + memTaken);
return memTaken;
}
这可靠地产生我的机器上的数字24。这种方法的优点是,它可以自动考虑对象的有效堆积影响,并考虑所有因素。当然,在信任之前,您应该检查它是否可靠。
你真的想估计对象的大小吗?看起来正确的问题是“因为我有一个巨大的对象,如何知道何时该写入磁盘并丢弃它?” – templatetypedef
够公平的,但我确实需要知道“巨大的手段”,对吧? – JAM
重复:http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –