次のドキュメントhttp://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#par_gc.ergonomics.default_sizeによると、並列 GC のデフォルトの最大ヒープ サイズは、式 MIN(メモリ/4、1GB)。式から明らかですが、ドキュメントには、「マシンにインストールされているメモリの量に関係なく、デフォルトの最大ヒープ サイズは 1GB を超えない」と記載されています。次のプログラムを書いたことを確認するには
パブリッククラス割り当て{ public static void main(String[] args) throws Exception { long メガバイト = Long.valueOf(args[0]); ロングバイト = メガバイト * 1024 * 1024; int longs = (int) (バイト/8); long[] arr = new long[longs]; Thread.sleep(Long.MAX_VALUE); System.out.println(arr.length); } }
このプログラムは、16Gb の RAM を搭載したボックスで実行しました。
smeldris@us4nrsdn01 割り当て]$ /usr/java/jdk1.6.0_26/bin/java 割り当て 2048 & [1] 9291 [smeldris@us4nrsdn01 割り当て]$ /usr/java/jdk1.6.0_26/bin/jmap -heap 9291 プロセス ID 9291 にアタッチしています。お待ちください... デバッガーが正常に接続されました。 サーバー コンパイラが検出されました。 JVM のバージョンは 20.1-b02 です スレッド ローカル オブジェクト割り当てを使用します。 8 スレッドの並列 GC ヒープ構成: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 4208984064 (4014.0MB) NewSize = 1310720 (1.25MB) MaxNewSize = 17592186044415 MB 旧サイズ = 5439488 (5.1875MB) 新しい比率 = 2 生存率 = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 85983232 (82.0MB) ヒープ使用量: PSヤングジェネレーション エデン スペース: 容量 = 65798144 (62.75MB) 使用済み = 1315976 (1.2550125122070312MB) 無料 = 64482168 (61.49498748779297MB) 2.0000199397721614% 使用済み 宇宙から: 容量 = 10944512 (10.4375MB) 使用済み = 0 (0.0MB) 無料 = 10944512 (10.4375MB) 0.0%使用 スペースへ: 容量 = 10944512 (10.4375MB) 使用済み = 0 (0.0MB) 無料 = 10944512 (10.4375MB) 0.0%使用 PSオールドジェネレーション 容量 = 2322923520 (2215.3125MB) 使用済み = 2147483664 (2048.000015258789MB) 無料 = 175439856 (167.31248474121094MB) 92.44745449045176% 使用済み PSパーマジェネレーション 容量 = 21757952 (20.75MB) 使用済み = 2606752 (2.485992431640625MB) 無料 = 19151200 (18.264007568359375MB) 11.980686417545181% 使用済み [smeldris@us4nrsdn01 割り当て]$
古い世代では 2GB の配列が割り当てられていました。MaxHeapSize は 4GB で、システム メモリの 1/4 です。JVM がヒープ用に 4GB を予約したのはなぜですか?