Ermutigen Sie die JVM GC anstatt wachsen die Haufen?
(Beachten Sie, dass, wenn ich sage "JVM" meine ich wirklich "Hotspot", und ich bin die neuste Java 1.6 update.)
Beispiel situation:
Mein JVM ausgeführt wird mit -Xmx gesetzt 1gb. Derzeit ist der Haufen hat 500mb zugewiesen, von denen 450mb verwendet wird. Das Programm braucht zu laden, weitere 200 mb auf dem heap. Derzeit gibt es 300mb Wert von "Sammlerstücke" Müll in den heap (gehen wir mal davon aus es ist alles in der ältesten generation.)
Unter normalen Betrieb der JVM wächst der heap zu 700 mb oder so, und Müll sammeln, wenn es sich herum.
Was möchte ich in dieser situation ist für die JVM gc zuerst, dann reservieren die neuen Sachen, so dass wir am Ende mit der heap-Größe bleiben auf 500 MB und die verwendeten heap bei 350mb.
Ist es eine JVM-parameter combo, die das tut?
InformationsquelleAutor der Frage Electrons_Ahoy | 2011-03-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, die Angabe
-XX:MinHeapFreeRatio
und-XX:MaxHeapFreeRatio
Steuern heap expansion und Schrumpfung:-XX:MinHeapFreeRatio
- wenn der Prozentsatz des freien Speicherplatzes in einer generation, die unter diesen Wert fällt die generation erweitert werden, um diesen Prozentsatz. Standardwert ist 40.-XX:MaxHeapFreeRatio
- wenn der Prozentsatz des freien Speicherplatzes in einer generation überschritten diesen Wert die generation schrumpft um diesen Wert. Standardeinstellung ist 70.Möchten Sie vielleicht auch das experiment mit dem gleichzeitigen GC durch die Angabe
-XX:+UseConcMarkSweepGC
. Je nach Anwendung könnte es, halten Sie die heap-Größe niedriger, um die Kosten für die zusätzliche CPU-Zyklen.Ist die JVM anders mit dem Speicher geben Sie als verfügbar, wenn es das optimale tun, um so. Sie geben eine geringere Menge, wie
-Xmx768m
zu halten, enthalten, und es könnte gut laufen, obwohl Sie würde das Risiko erhöhen, läuft der Arbeitsspeicher im schweren Szenario laden. Wirklich der einzige Weg, um weniger Speicher insgesamt ist code zu schreiben, der weniger Speicher verbraucht 🙂InformationsquelleAutor der Antwort WhiteFang34
Es sind vier (eigentlich fünf) verschiedene garbage-Kollektoren in HotSpot, und Ihre Möglichkeiten sind für jeden anders.
-XX:MinHeapFreeRatio
und-XX:MaxHeapFreeRatio
mit denen Sie mehr oder weniger direkt das Verhalten Steuern. Ich habe nicht viel Erfahrung mit der serial collector jedoch.-XX:+UseParallelOldGC
) hat-XX:MaxGCPauseMillis=<millis>
und-XX:GCTimeRatio=<N>
. Einstellung einer niedrigeren maximalen Pausenzeit in der Regel bewirkt, dass die Kollektor-machen die Haufen kleiner. Jedoch, wenn Sie die pause-Zeit ist schon klein der Haufen nicht kleiner geworden. OTOH, wenn die max pause-Zeit zu niedrig eingestellt ist, kann die Anwendung verbringen all Ihre Zeit zu sammeln. Durch einen geringeren gc-Zeit-Verhältnis auch in der Regel macht die Haufen kleiner. Sie sagen, der gc, dass Sie bereit sind, zu widmen, die mehr CPU-Zeit auf die Sammlung im Gegenzug für einen kleineren Haufen. Dies ist jedoch nur ein Hinweis und kann keine Wirkung haben. Meiner Meinung nach, die parallel collector ist in der Nähe untunable für den Zweck der Minimierung der heap-Größe. Dieser Kollektor funktioniert besser (er stellt sich selbst), wenn Sie lassen Sie es für eine Weile laufen und das Verhalten der Anwendung konstant bleibt.-XX:+UseConcMarkSweepGC
) erfordert in der Regel einen größeren Haufen, um erreichen Ihr Hauptziel des low-pause-Zeit, also werde ich nicht diskutieren.-XX:+UseG1GC
) ist nicht so hirntot wie die älteren Sammler. Ich finde, dass es wählt eine kleinere heap-Größe auf seine eigene. Es hat eine Menge an tuning-Optionen, zwar hab ich erst angefangen zu studieren.-XX:InitiatingHeapOccupancyPercent
-XX:G1HeapWastePercent
-XX:G1ReservePercent
und-XX:G1MaxNewSizePercent
von Interesse sein können.Werfen Sie einen Blick auf die offizielle Dokumentation für die Müllsammler sowie diese Liste der Flaggen.
InformationsquelleAutor der Antwort Aleksandr Dubinsky
Könntest du Sie in der Regel rufen die
System.gc()
- Methode vor der Zuweisung der zusätzlichen 200 MB Objekte, sondern dies nur ein Hinweis auf die JVM, dass er es kann oder kann nicht Folgen und in anycase Sie nicht wissen, Wann dieser stattfindet.. wie gesagt von innen-Dokumentation, es ist ein best-effort-Anfrage.Durch die Art und Weise zu berücksichtigen, dass die garbage collection ist eine schwere operation, so dass, wenn es gibt keine spezifische Notwendigkeit, es zu tun, nur nicht versuchen zu erzwingen.
Nur zu wissen: wenn Sie
-Xmx1G
dann sagen Sie, um die JVM, die 1 GB ist der maximale Speicherplatz für den heap, und da Sie angeben, dass sehe ich nicht ein, warum er versuchen sollte, Sie niedrig halten, wenn er weiß, dass 1GB noch ok (wir sind im Rahmen der Speicher-verwalteten Sprachen). Wenn Sie nicht möchten, dass der heap zu erhöhen, dass viel, einfach verringern Sie den maximalen Wert, so dass Sie gezwungen werden zu tun, GC, bevor der Zuweisung von neuen Objekten, warum sonst erzählst du es verwenden 1GB?InformationsquelleAutor der Antwort Jack
Würd ich empfehle einen Blick hier:
http://www.petefreitag.com/articles/gctuning/
InformationsquelleAutor der Antwort MeBigFatGuy