我正在運行Oracle提供的64位Java 1.8 Hotspot JVM。我一直試圖圍繞JVM行爲的差異來解決當使用不同GC機制時壓縮對象指針的問題。例如:G1和CMS的UseCompressedOops kick-in閾值不同
$ 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旋鈕,但不能得到壓縮的指針優化踢在堆規模以上32736 MB爲G1。但是,您可以清楚地看到,CMS可以使用壓縮指針來存儲最大32766 MB的堆大小。我想了解什麼控制不同的GC算法的這個閾值。
最後一個命令「-XX:+ G1GC」中的G1標誌是否爲錯字? – IceMan
@IceMan是的,謝謝你指出。我只是糾正它。 –