2016-08-03 4 views
1

Ich verwende eine 64-Bit Java 1.8 Hotspot JVM von Oracle. Ich habe versucht, meinen Kopf um einen Unterschied im Verhalten von JVM zu wickeln in komprimierten Objektzeigern zu treten, wenn verschiedene GC-Mechanismen verwendet werden. Zum Beispiel:UseCompressedOops Kick-In-Schwelle unterschiedlich für G1 und CMS

$ 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} 

Ich habe versucht, ein paar anderen G1GC Knöpfe ändern, aber nicht komprimieren Zeiger Optimierung für Speichergrößen über 32.736 MB für G1 tritt in bekommen. Aber wie Sie sehen können, kann CMS komprimierte Zeiger für Heap-Größen bis zu 32766 MB verwenden. Ich versuche zu verstehen, was diese Schwelle für verschiedene GC-Algorithmen steuert.

+0

Ist der G1-Flag in dem letzten Befehl '-XX: + G1GC' einen Tippfehler? – IceMan

+0

@IceMan Ja, es war, vielen Dank für den Hinweis it out. Ich habe es gerade korrigiert. –

Antwort

0

kann es aber nicht komprimierte Zeiger Optimierung erhalten zu Speichergrößen über 32.736 MB kick für

Das ist normal, da Objekte ausgerichtet sind Grenzen standardmäßig 8Byte, was bedeutet, dass die niedrigsten 3 Bits sind redundant und sein durch eine Verschiebung eliminiert, was wiederum bedeutet, Zeiger 32-Bit-Objekt kann höchstens Adresse 4GB * 8 im wert von Objekten mit dieser Ausrichtung.

Sie müssen die Objektausrichtung auf 16 Bytes über stoßen, wenn Sie mehr als 32GB mit komprimierten oops verwenden möchten. Beachten Sie, dass dadurch kleine Objekte größer werden, d. H. Es wird etwas Speicher verschwendet, sodass Sie messen müssen, ob es Ihnen tatsächlich etwas bringt.

This answer hat einige zusätzliche Diagnosemöglichkeiten, die von Interesse sein könnten.

+0

Das ist die Sache. Ich verwende nicht mehr als 32 GB Heap. Sowohl 32766 MB als auch 32736 MB sind weniger als 32 GB. CMS verwendet komprimierte Zeiger bis 32766 MB, aber G1 verwendet nur bis 32736 MB Heap. Ich kann nicht verstehen, was den Unterschied zwischen diesen Schwellen ausmacht. (Bearbeitete die Frage, um die Verwirrung, die ich habe, klar widerzuspiegeln.) –

+0

Warum ist dieser winzige Unterschied überhaupt von Bedeutung? Wie auch immer, die Antwort, die ich verlinkt habe, enthält Diagnoseflags, sie können Ihnen bei Ihrem "Problem" helfen. – the8472