Oracle の 64 ビット Java 1.8 Hotspot JVM を実行しています。私は、異なる GC メカニズムが使用されている場合に、JVM の動作の違いに頭を悩ませて、圧縮されたオブジェクト ポインターを起動しようとしています。例えば:
$ java -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -Xms32766m -Xmx32766m
bool UseCompressedClassPointers := true {lp64_product}
bool UseCompressedOops := true {lp64_product}
$ java -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -Xms32767m -Xmx32767m
bool UseCompressedClassPointers = false {lp64_product}
bool UseCompressedOops = false {lp64_product}
$ java -XX:+UseG1GC -XX:+PrintFlagsFinal -Xms32736m -Xmx32736m
bool UseCompressedClassPointers := true {lp64_product}
bool UseCompressedOops := true {lp64_product}
$ java -XX:+UseG1GC -XX:+PrintFlagsFinal -Xms32737m -Xmx32737m
bool UseCompressedClassPointers = false {lp64_product}
bool UseCompressedOops = false {lp64_product}
他のいくつかの G1GC ノブを変更しようとしましたが、G1 の 32736 MB を超えるヒープ サイズで圧縮ポインターの最適化を開始できません。しかし、明らかにわかるように、CMS は最大 32766 MB のヒープ サイズに圧縮ポインタを使用できます。さまざまな GC アルゴリズムのこのしきい値を制御するものを理解しようとしています。