JVM は、複数のスレッドで同時に実行できるように、メモリをチャンクで割り当てます。これはThread-Local Allocation Bufferと呼ばれます。
TLAB - スレッド ローカル割り当てバッファー。同期せずにヒープ領域をすばやく割り当てるために使用されます。コンパイルされたコードには、現在のスレッドの TLAB の最高水位標をバンプしようとするいくつかの命令の「高速パス」があり、バンプされたマークが TLAB 固有の制限アドレスよりも前にある場合、オブジェクトを正常に割り当てます。
でこれをオフに-XX:-UseTLABすると、より正確なメモリ使用量の情報が得られます。
public static void main(String... args) {
for (int i = 0; i < 10; i++) {
long used1 = memoryUsed();
new Object();
long used2 = memoryUsed();
System.out.println(used2 - used1);
}
}
public static long memoryUsed() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
デフォルトのオプションで印刷
0 0 0 0 0 0 0 0 0
と-XX:-UseTLAB
16 16 16 16 16 16 16 16 16 16