2013-03-15 8 views
13

Ich habe gelesen this article über virtuelle Maschine Garbage-Tuning, um den Java-Garbage-Collector besser zu verstehen. Jeder Speicherplatz hat einen virtuellen Heap-Speicherbereich, in den er hineinwachsen kann, da der benötigte Heap-Speicherplatz näher an die maximale Heap-Größe heranrückt. Dies kann in diesem Bild zu sehen: Java GC arrangement of generations http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/190244.gifSind Verhältnisse zwischen Leerzeichen/Generationen in der Java Heap-Konstante?

Sie das Verhältnis zwischen Young Generation einstellen und Alt (Tenured) Erzeugung mit den NewRatio Parametern, und das Verhältnis zwischen Eden Raum und Survivor Space mit dem SurvivorRatio Parameter.

Kürzlich wurde this question gefragt, wie die Standardverhältnisse für die Heap-Bereiche ermittelt werden können. Es besagt, dass Sie den PrintGCDetails Parameter verwenden und die Verhältnisse manuell berechnen sollten.

Meine Frage ist: Erhöht sich die Größe der verschiedenen Heap-Räume um das gleiche Verhältnis, so dass das Verhältnis zwischen ihnen beim Start während der gesamten Laufzeit der Anwendung konstant bleibt? Wenn beispielsweise "Generation" und "Old/Tenured Generation" ein Standard-NewRatio-Wert von 3 lautet, beträgt der anfängliche reservierte Heapspeicher 100 MB für Young und 300 MB für Old. Wenn mehr Speicherplatz für den alten Speicherplatz reserviert werden muss, sagen wir 300 MB mehr, also insgesamt 600 MB. Speichert sich der für Young Space reservierte Speicher ebenfalls auf 200 MB, wobei das Verhältnis intakt bleibt?

Antwort

9

Ich glaube, Sie beziehen sich auf GC Ergonomie und die Adaptive Größe Politik

  • ein Merkmal der Hotspost GC, die automatisch die Größen der Generationen zur Laufzeit basierend auf der Anpassung aktuelles Zuordnungsverhalten der laufenden Anwendung
  • Diese Funktion ist standardmäßig aktiviert und steuert/passt die Größe der Generationen zur Laufzeit an.
  • in der Tat, einige der GC Parameter wird ignoriert, wenn Sie zB nicht Adaptive Größe Richtlinie deaktivieren. -XX:SurvivorRatio=.

Sie können deaktivieren die Adaptive Größe Politik durch die -XX:-UseAdaptiveSizePolicy verwenden. Sobald Sie die AdaptiveSizePolicy deaktiviert haben, berücksichtigt der GC die anfängliche Größe der von den Startparametern angegebenen Generationen (z. B. -Xms, , -XX:NewSize=, -XX:SurvivorRatio=) und sie bleiben konstant.

Sie können mehr über Adaptive Size-Richtlinie in UseAdaptiveSizePolicy and other jvm opts finden.

+0

Gute Antwort, erklärt einige Konzepte, von denen ich vorher nicht wusste. – ghdalum

1

PermGen vs Junge Generation Verhältnis wird teilweise von JVM beibehalten, aber um zu sagen, wenn das Verhältnis beibehalten wird, ist die Antwort No.

JVM7 ist weit fortgeschritten und komplizierter geworden, wo wir die Zuordnung von Generationen im Heap nicht vorhersagen sollten.

In jedem GC-Zyklus, den JVM ausführt, werden auch metrische Analysen durchgeführt, um das aktuelle Speicherverhalten im Speicher zu ermitteln. - Wenn mehr Objekte die mehreren Zyklen von GC überleben, wird PermGen reduziert und ein Teil des Speicherplatzes wird YoungGeneration zugewiesen. Grundsätzlich spielt No. of objects x number of GC cycles they skip ein Kriterium bei der dynamischen Anpassung des Generierungsverhältnisses.

Ich hoffe es hilft, danke.

+0

Ich verstehe Teile Ihrer Antwort nicht. "Wenn mehr Objekte die Mehrfachzyklen von Heap überstehen, wird Permgen reduziert und ein Teil des Speicherplatzes wird YoungGeneration zugewiesen". Wenn mehr Objekte überleben, sollte nicht OldGeneration mehr Speicher zuweisen? Warum Permgen in die Mischung bringen? Und wenn in den Startparametern ein NewRatio angegeben ist, wird das Verhältnis immer noch nicht beibehalten? – ghdalum

+1

Das ist eine gute Frage. "Wenn mehr Objekte überleben, sollte nicht OldGeneration mehr Speicher zuweisen?" Ja sollte es sein. Was ich meine, ist "PermGen wird ClassLoaders verwendet, und wenn JVM sieht GC nicht in der Lage, Objekt zu löschen (aus gültigen Gründen) versucht es, nicht ausgelasteten Speicher von PermGen abrufen und für Object Speicher zuordnen. Wrt zu Ihrer Frage, Diese Zuweisung wird an OldGeneration oder eine neue Generation gehen, basierend auf einem Extrapolationsalgorithmus, der von JVM verwendet wird, um die Zuweisung in der nahen Zukunft zu bestimmen –

1

Edit: Ich denke, ich habe etwas falsch. Setze diese Nachricht hier, während ich nachforsche, um nicht Leute auf den falschen Weg zu schicken!

Ales0x Antwort ist groß, wenn Sie Parallel Scavenge GC (-XX:+UseParallelGC) verwenden, aber Concurrent Mark-Sweep GC (-XX:+UseConcMarkSweepGC) nicht adaptive Dimensionierung unterstützen.

Mit Concurrent Mark-Sweep wird die neue/junge Generation Größe auf der Basis der (es sei denn, Sie geben -XX:NewSize=) Anfang Heap-Größe festgelegt. Die Größe der neuen Generation wird nicht ändern, wenn der Heap wächst.

Verwandte Themen