爲什麼當我爲新字節[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);
爲什麼當我爲新字節[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);
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
這是否意味着我測試中的新字節[1000]不是創建在堆上? – 2013-04-23 06:17:05
默認情況下,它是在一個線程本地分配緩衝區(它位於堆的Eden空間中)中創建的,而freeMemory()不會看到它們使用了多少。如果關閉TLAB,您可以看到使用了多少內存。 – 2013-04-23 07:42:04
[Runtime.freeMemory()](http://docs.oracle.com/javase/1.5.0/docs/api/java /lang/Runtime.html#freeMemory())是可用內存的近似值,它不是一個精確的計算 – 2013-04-23 03:42:01