Ich arbeite an einer performancekritischen serverseitigen Java-Anwendung.
Sobald das System gestartet ist, erwarte ich, dass keine langlebigen Objekte erstellt werden - nur solche mit kurzen Leben (bis zu 10 Sekunden). Ich möchte daher die JVM so einstellen, dass die Alte Generation konstant ist, sobald das System gestartet ist.
Ich denke, dass ich Erfolg hatte, aber ich verstehe nicht warum (siehe unten).
Hier sind unsere Einstellungen:
-Xmx3000m -Xms3000m -verbose: gc -XX: + PrintGCTimeStamps -XX: + PrintGCDetails -XX: + UseConcMarkSweepGC -XX: SurvivorRatio = 5 -XX: TargetSurvivorRatio = 90 -XX: MaxTenuringThreshold = 31 -XX: + PrintTenuringDistribution - XX: NewSize = 1250m -XX: MaxNewSize = 1250m
Wir verwenden Oracles Java 1.6.
Ich bin wirklich verwirrt durch die Ausgabe des Flags "PrintTenuringDistribution". Ich sehe die Ausgabe so:
%Vor%Da ich viele Objekte mit Alter = 15 habe und der Schwellenwert 16 ist, würde ich erwarten, dass jedes Objekt in einem GC entweder (a) in die Alte Generation befördert wird oder (b) Müll gesammelt wird.
Aber laut JConsole nimmt meine alte Generation nicht zu. Was passiert mit all diesen Objekten?
Die Alter, die Sie haben, sind für Objekte im Überlebendenraum. Da Sie einen großen Eden-Raum haben, sind die meisten Objekte, die zum Überlebendenraum werden, relativ alt.
Tags und Links java garbage-collection