2013-04-23 71 views
1

爲什麼當我爲新字節[1000 * 1000]創建新字節[1000]和1000016時,此程序打印0?爲什麼Runtime.freeMemory()僅在創建大對象時才更改?

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

[Runtime.freeMemory()](http://docs.oracle.com/javase/1.5.0/docs/api/java /lang/Runtime.html#freeMemory())是可用內存的近似值,它不是一個精確的計算 – 2013-04-23 03:42:01

回答

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 
+0

這是否意味着我測試中的新字節[1000]不是創建在堆上? – 2013-04-23 06:17:05

+0

默認情況下,它是在一個線程本地分配緩衝區(它位於堆的Eden空間中)中創建的,而freeMemory()不會看到它們使用了多少。如果關閉TLAB,您可以看到使用了多少內存。 – 2013-04-23 07:42:04

相關問題