Kraft volle garbage collection, wenn der Speicher Besatzung geht über eine bestimmte Schwelle
Habe ich eine server-Anwendung, die, in seltenen Fällen können genügend große Speicherbereiche.
Ist es nicht ein Speicher-Leck, als diese Abschnitte können zurückgefordert werden, vom garbage collector durch ausführen einer full garbage collection. Normale garbage collection befreit Mengen an Speicher, die sind zu klein: es ist nicht ausreichend, in diesem Zusammenhang.
Den garbage collector führt diese full GCs, wenn Sie es für angemessen hält, und zwar dann, wenn der Speicherbedarf der Anwendung nähert sich der vorgegebenen maximum angegeben mit -Xmx.
Das wäre ok, wenn es nicht für die Tatsache, dass diese problematischen Speicher-Zuweisungen kommen in bursts, und kann zu OutOfMemoryErrors aufgrund der Tatsache, dass ist die jvm nicht in der Lage, eine GC-schnell genug, um die erforderlichen Speicher. Wenn ich manuell aufrufen System.gc() vorab, ich kann diese situation verhindert.
Trotzdem würde ich es vorziehen, nicht mit monitor meine jvm memory allocation mich (oder legen Sie den Speicher-management in meine Anwendung Logik); es wäre schön, wenn es war ein Weg, um die Ausführung der virtuellen Maschine mit einer memory-Schwelle, über die volle GCs würde automatisch ausgeführt werden, um Sie zu lösen, sehr früh den Speicher brauche ich noch.
Lange Geschichte kurz: ich brauche eine Möglichkeit (ein Befehlszeilen-option?) zum konfigurieren der jvm-um-release Anfang eine gute Menge an Speicher (d.h. führen Sie eine vollständige GC), wenn der Speicher Besatzung einen bestimmten Schwellenwert erreicht, ist mir egal, wenn das verlangsamt meine Anwendung nach unten jeder einmal in eine Weile.
Alle die ich gefunden habe, bis jetzt sind die Möglichkeiten zum ändern der Größe der Generationen, aber das ist nicht das, was ich brauche (zumindest nicht direkt).
Ich würde schätzen Ihre Anregungen,
Silvio
P. S. ich arbeite an einem Weg, um zu vermeiden, große Zuweisungen, aber es kann verlangen, eine lange Zeit, und inzwischen ist meine app braucht ein wenig Stabilität
UPDATE: Analyse der app mit jvisualvm, ich kann sehen, dass das problem in der alten generation
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom hier (dies ist eine 1.4.2-Seite, aber die gleiche option vorhanden sein sollte, in allen Sun-JVMs):
vorausgesetzt, Sie sind mit der CMS garbage collector (der ich glaube, dass der server standardmäßig eingeschaltet), die option, die Sie wollen, ist
wo % ist % Speicher in Gebrauch, die auslösen, dass eine vollständige GC.
Legen Sie standard-Disclaimer hier Durcheinander mit GC-Parameter geben kann Sie schwere Probleme mit der Leistung, stark variiert von Maschine, etc.
Beim zuordnen von großen Objekten, die nicht passen in die junge generation, Sie sind sofort zugeordnet werden, die pragmatisierte generation Raum. Dieser Raum ist nur GC ' ed werden, wenn ein vollständiger-GC ausgeführt wird, die Sie versuchen zu zwingen.
Aber ich bin nicht sicher, dies würde Ihr problem lösen. Sie sagen "JVM ist nicht in der Lage, eine GC schnell genug". Auch wenn Ihre Zuweisungen kommen in bursts, jeder Zuordnung wird die Ursache der VM zu überprüfen, ob es genügend Speicherplatz verfügbar ist, um es zu tun. Wenn nicht - und wenn das Objekt zu groß für die junge generation - wird es zu einer vollständigen GC was soll "stop the world", wodurch verhindert wird, neue Zuweisungen von der Einnahme in den ersten Platz. Sobald die GC abgeschlossen ist, wird Ihr neues Objekt zugewiesen werden.
Wenn kurz danach die zweite große Aufteilung beantragt, Ihr platzen, wird es nicht die gleiche Sache wieder. Je nachdem, ob das erste Objekt noch benötigt wird, wird es entweder gelingt es Ihnen, in GC ' Ing es an, womit Raum für die nächste Zuordnung oder fehlschlagen, wenn die erste Instanz ist immer noch verwiesen wird.
Sagen Sie: "ich brauche einen Weg, [ ... ] zum release Anfang eine gute Menge an Speicher (d.h. führen Sie eine vollständige GC), wenn der Speicher Besatzung einen bestimmten Schwellenwert erreicht". Diese per definition kann nur gelingen, wenn das "guter Arbeitsspeicher" nicht verwiesen wird, indem Sie alles in Ihrer Anwendung mehr.
Von dem, was ich hier verstehen, müssen Sie möglicherweise eine race-Bedingung, die Sie vielleicht manchmal vermeiden, indem interspersing manuelle GC-Anfragen. Im Allgemeinen sollten Sie nie haben, um über diese Dinge zu kümmern - aus meiner Erfahrung einen OutOfMemoryError tritt nur auf, wenn es in der Tat zu viele Zuweisungen fit zu sein in dem Haufen gleichzeitig. In allen anderen Situationen ist der "einzige" problem sein sollte, ein Leistungsabfall (das könnte zu extremen, je nach den Umständen, aber das ist ein anderes problem).
Ich schlage vor, Sie tun weitere Analyse der genauen problem, um dies auszuschließen. Ich empfehle die VisualVM-tool, das mit Java 6. Starten Sie es und installieren Sie die VisualGC plugin. Dies ermöglicht Ihnen zu sehen, die verschiedenen Speicher-Generationen und Ihre Größen. Auch dort gibt es eine fülle von GC-Protokollierung Optionen, je nachdem, welche VM, die Sie verwenden. Einige Optionen wurden schon in anderen Antworten.
Die anderen Optionen für die Auswahl, die GC zu verwenden und wie Sie Sie optimieren können Schwellenwerte sollten keine Rolle in deinem Fall, weil Sie alle hängen genug Speicher vorhanden ist, um enthalten alle Objekte, die den Bedürfnissen Ihrer Anwendung zu jeder Zeit. Diese Optionen können hilfreich sein, wenn Sie performance-Probleme im Zusammenhang mit schweren GC-Aktivität, aber ich fürchte, Sie wird nicht zu einer Lösung führen, in Ihrem Fall zu.
Sobald Sie mehr Vertrauen in das, was eigentlich passiert ist, eine Lösung zu finden wird einfacher.
Wissen Sie, was von der garbage collection-pools sind zu umfangreich?....also eden vs survivor space? (versuchen Sie die JVM-option
-Xloggc:<file> log GC status to a file with time stamps
)...Wenn Sie dies wissen, Sie sollten in der Lage sein, zu optimieren, die Größe des pool erfolgt mit einer der Optionen, die hier erwähnt werden: die hotspot-Optionen für Java 1.4Ich weiß, die Seite ist für den 1,4-JVM, ich kann nicht scheinen zu finden, die gleichen -X-Optionen auf meiner aktuellen 1.6 installieren Sie die Hilfe-Optionen, es sei denn, diese einzelnen pool-Größen ist eine nicht-standard, nicht-standard-Funktion!
Ist die JVM, sollte nur werfen eine
OutOfMemoryError
nach es versucht hat, Speicher freizugeben, über die garbage collection (sowohl nach die API docs für OutOfMemoryError und die JVM-Spezifikation). Daher versuche force garbage collection sollte keinen Unterschied machen. So könnte es etwas mehr bedeutsam hier Los ist, entweder ein problem mit dem Programm nicht ordnungsgemäß clearing-Referenzen oder, weniger wahrscheinlich, ein JVM-Fehler.Gibt es eine sehr detaillierte Erklärung, wie GC funktioniert hier und es werden Parameter aufgelistet, die zur Steuerung Arbeitsspeicher verfügbar, um unterschiedliche Speicher-pools/Generationen.
Versuchen -server-option. Es ermöglicht die parallele gc-und Sie haben etwas die Leistung erhöhen, wenn Sie die Verwendung von multi-core-Prozessor.
Haben Sie versucht, spielen mit G1 gc? Es sollte in 1.6.0u14 ab.