Warum ändert sich die von JMX gemeldete JVM Heap Usage Max im Laufe der Zeit?

8

Mein JVM-Heap max ist mit 8 GB auf dem Namensknoten für einen meiner Hadoop-Cluster konfiguriert. Wenn ich diese JVM mit JMX überwache, schwankt das gemeldete Maximum ständig, wie im angehängten Bild gezeigt.

Ссылка

Ich sehe dieses Verhalten nur bei einem (der aktivsten) meiner Hadoop-Cluster. Bei den anderen Clustern bleibt das angegebene Maximum auf dem konfigurierten Wert. Irgendwelche Ideen, warum sich das gemeldete Maximum ändern würde?

Aktualisierung:

Die Java-Version ist "1.6.0_20"

Der maximale Wert für den Heap wird in hadoop-env.sh mit der folgenden Zeile festgelegt:

export HADOOP_NAMENODE_OPTS="-Xmx8G -Dcom.sun.management.jmxremote.port=8004 $JMX_SHARED_PROPS"

ps zeigt:

hadoop 27605 1 99 Jul30 ? 11-07:23:13 /usr/lib/jvm/jre/bin/java -Xmx1000m -Xmx8G

Update 2:

Der Schalter -Xms8G wurde gestern Abend zur Startbefehlszeile hinzugefügt:

export HADOOP_NAMENODE_OPTS="-Xms8G -Xmx8G -Dcom.sun.management.jmxremote.port=8004 $JMX_SHARED_PROPS"

Wie in der Abbildung unten gezeigt, variiert der Maximalwert immer noch, obwohl sich das Muster anscheinend geändert hat.

Ссылка

Update 3:

Hier ist ein neues Diagramm, das auch Non-Heap max anzeigt, das konstant bleibt:

Ссылка

    
highlycaffeinated 10.08.2012, 15:55
quelle

2 Antworten

1

Laut der MemoryMXBean -Dokumentation ist die Speichernutzung berichtet in zwei Kategorien, "Heap" und "Non-Heap" Speicher. Die Beschreibung der Nicht-Heap-Kategorie lautet:

  

Die Java Virtual Machine verwaltet anderen Speicher als den Heapspeicher (bezeichnet als Nicht-Heap-Speicher).   Die Java Virtual Machine verfügt über einen Methodenbereich, der von allen Threads gemeinsam genutzt wird. Der Methodenbereich gehört zu Nicht-Heap-Speicher. Es speichert pro-Klassen-Strukturen wie eine Laufzeitkonstante Pool, Feld und Methode Daten und den Code für Methoden und Konstruktoren. Es wird beim Start der Java Virtual Machine erstellt.

     

Der Methodenbereich ist ein logischer Teil des Heapspeichers, aber eine Java Virtual Machine-Implementierung kann sich dafür entscheiden, sie nicht zu sammeln oder zu komprimieren. Ähnlich wie der Heap kann der Methodenbereich eine feste Größe haben oder erweitert und geschrumpft sein. Der Speicher für den Methodenbereich muss nicht zusammenhängend sein.

Diese Beschreibung klingt ähnlich wie die permanente Generierung (PermGen), die tatsächlich Teil des Heaps ist und gegen den Speicher, der mit dem -Xmx Flag zugewiesen wurde, zählt. Ich bin nicht sicher, warum sie beschlossen haben, dies separat zu melden, da es Teil des Heaps ist.

Ich vermute, dass die Fluktuationen, die Sie sehen, ein Ergebnis davon sind, dass die JVM schrumpft und die permanente Generierung zunimmt, was dazu führen würde, dass sich der gemeldete maximale Heap-Speicherplatz für Nicht-PermGen-Anwendungen entsprechend ändert. Wenn Sie eine Summe der Heap- und Non-Heap-Maxes erhalten könnten, wie von JMX berichtet, und diese Summe konstant bei der 8G-Grenze bleibt, würde dies diese Hypothese bestätigen.

    
Alex 15.08.2012 14:36
quelle
0

Eine Möglichkeit ist, dass der JVM-Survivor-Space in maximaler Größe schwankt.

Die JVM-Maximalgröße, die von JMX über das HeapMemoryUsage.max-Attribut gemeldet wird, ist nicht die tatsächliche Maximalgröße des Heapspeichers (d. h. der mit -Xmx festgelegte Wert)

Der angegebene Wert ist die maximale Heap-Größe minus der maximalen Survivor-Speicherplatzgröße

Um die gesamte maximale Größe des Heapspeichers zu erhalten, fügen Sie die beiden jmx-Attribute hinzu:

%Vor%

(getestet auf Orakel jdk 1.7.0_45)

    
croesus 21.02.2014 09:59
quelle

Tags und Links