wird die JVM beendet, während der Ausführung jmap?
funktioniert mein java-Anwendung weiterhin ausgeführt werden, während jmap ist seine memory-dump?
Dank
InformationsquelleAutor StefanoS | 2011-03-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Anwendung ist gestoppt. Die einzige praktische Weg, um eine genaue heap-dump wäre, beenden Sie alle Programm-Aktivitäten während der dump erstellt wird.
Ob dies eine "kurze" pause " oder eine "lange" pause hängt davon ab, wie viel ausgegeben wird. Wenn Sie "-dump" dann wirst du einen dump der ganze Haufen, inklusive nicht erreichbaren Objekte. Wenn Sie "-dump:live" du wirst nur dump erreichbaren Objekte ... aber das bringt auch (mindestens) Kennzeichnung der Haufen, um herauszufinden, welche Objekte erreichbar sind.
Aber wenn du servierst einem gigabyte Größe heap, erwarten Sie die pause-Zeit, gemessen in Sekunden oder Minuten anstatt in Millisekunden.
Wieder den Vorschlag, dass Sie könnten, zu vermeiden beenden der JVM durch die Verwendung der Gabel, es stellt sich heraus, dass die Verzweigung ein Multithread-Prozess, können problematisch sein:
Dann da ist, ist der Einsatz von Ressourcen-Problem.
Auch wenn dies, wie die meisten/alle JVM ist es heute tun, ich bin mir nicht sicher, dass dies der "einzige Weg, um eine genaue heap-dump". Man könnte auch
fork
und führen Sie die heap-dump, von der Kind-Prozess. Dadurch würde sich natürlich eine Menge Speicher für die Kopie-bei-Schreibvorgang-Funktion, aber wahrscheinlich nicht so viel, wie 2x, wenn Sie freie Seiten, wie Sie gehen.Geändert "einzige Weg" zu "nur praktisch".
Würden Sie erwarten, dass der dump einige Minuten oder sogar mehr für gigabyte+ große Haufen? Es scheint, wie es ist, wächst der heap-Datei sehr langsam und es nimmt eine ziemlich lange Zeit.
Ich würde erwarten, dass es relativ schnell. Jedoch, eine langsame Datei-system oder die nicht genügend physikalischer Speicher (im Vergleich mit der JVM die vmem-Größe) könnte führen zu langen dump mal.
InformationsquelleAutor Stephen C
Hatte ich ein Problem mit dem Versuch, dies zu tun auf einer Produktions-Maschine erstellen der hprof-Datei mit jmap dauerte eine Ewigkeit, und natürlich gesperrt, bis Sie die java-webapp für das Alter.
Fand ich diese Seite:
http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/
Erläutert, dass Sie können auch verwenden Sie gdb (auf linux-Systemen) zum ausgeben der Kern der java-Prozess.
Mit dieser core-Datei können Sie erzeugen dann die hprof-Datei für die Analyse in einem separaten Prozess, die verhindern, dass Ihre java-server-Prozess wird unterbrochen für eine so lange Zeit. Was würde passieren, wenn Sie führen Sie den gleichen Vorgang mit jmap.
Zusammenfassen:
herunterladen und installieren gdb
...
Holen Sie sich die java-Prozess-id des java-Prozess, der Sie interessiert
starten eines gdb-Sitzung mit, dass der Prozess
erzeugen dann die core-Datei:
Ende der gdb-Sitzung
dann verwenden Sie die core-Datei erzeugt, um eine hprof-Datei:
dann (g)zip-Datei und kopieren Sie es auf Ihren Computer zur weiteren Analyse.
InformationsquelleAutor Simon B
Ich würde sagen, dass Ihr Programm kurz unterbrechen, während die memory-dump genommen wird.
Der memory dump ist eine Momentaufnahme in der Zeit Ihres Laufenden Programms, so jmap werden müssen, sperren Sie die JVM-kurz zwar, dass der Speicher gelesen wird. Senden Sie die dump-Datei an den client zurück jedoch kann man in einem separaten thread, damit die Minimierung der pause.
InformationsquelleAutor npellow