JEP 345: NUMA-Aware Memory Allocation for G1
NUMA とは、Non-Uniform Memory Access の略で、マルチプロセッサのコンピュータアーキテクチャの1形態です。CPU コアにメインメモリのコントローラが内包されており、メインメモリが従属する CPU コアが決まっています。CPU コアは、自分の持っているメモリ (ローカルメモリ) には高速にアクセスできますが、他コアのメモリ (リモートメモリ) へはコア間接続 (インターコネクト) 経由でアクセスするため、遅くなります。
対義語は UMA (Uniform Memory Access) で、全コアがコア外のメモリコントローラ経由でメインメモリにアクセスするようになっていて、どのコアもどのメモリへも均一のアクセス速度を持つ形態です。
Intel では Core i7 や Xeon の Nehalem 世代以降、NUMA になっています。AMD だと Opteron は NUMA です。Ryzen は NUMA も UMA も出来るというびっくり仕様。
Java VM においては、Parallel GC では以前から NUMA が考慮されていましたが、他の GC では考慮されていませんでした。今回、G1 GC で NUMA を考慮するようになりました。
具体的にはまず、各 NUMA ノードに均一にヒープを確保します。その上で、新しいオブジェクトを割り当てるときには、それを行うスレッドに紐付く NUMA ノード上のメモリを優先的に割り当てます。生存期間の短いオブジェクトは、割り当てたスレッドからのアクセスが断然多いということが経験上分かっているため、効率が良くなります。
大きいオブジェクトや古い世代のオブジェクトは、この限りではなくなります。
有効化するには、-XX:+UseNUMA オプションを付けて起動します。
番町のITおじさんが書く、ITエンジニアの教養ブログです。様々なプログラミング言語やソフトウェア工学についての知識、ITやIT業界の歴史、動向などを取り上げます。