为什么Runtime.freeMemory()只在我创建一个大对象时才会改变?

时间:2013-04-23 02:46:02

标签: java

为新字节[1000]创建新字节[1000]和1000016时,为什么该程序打印0?

    long m0 = Runtime.getRuntime().freeMemory();
    Object obj = new byte[1000];
    long m1 = Runtime.getRuntime().freeMemory();
    System.out.println(m0 - m1);

1 个答案:

答案 0 :(得分:2)

OpenJDK / Oracle HotSpot JVM使用TLAB(线程本地分配缓冲区)来支持并发对象分配。这意味着每个线程都会抓取内存块供其使用。如果关闭它,您将看到准确的记忆记帐。

使用-XX:-UseTLAB

运行
long m0 = Runtime.getRuntime().freeMemory();
Object obj = new Object();
long m1 = Runtime.getRuntime().freeMemory();
if (m1 == m0)
    throw new AssertionError("Please disable the TLAB with -XX:-UseTLAB");
System.out.println(m0 - m1);

打印

16