I am running a 64 bit Java 1.8 Hotspot JVM by Oracle. I have been trying to wrap my head around a difference in behavior of JVM to kick in compressed object pointers when different GC mechanisms are used. For example:
$ 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}
I have tried changing a few other G1GC knobs but cannot get compressed pointer optimization to kick in for heap sizes above 32736 MB for G1. But, as you can see clearly that CMS can use compressed pointers for heap sizes up to 32766 MB. I am trying to understand what controls this threshold for different GC algorithms.