Ich betrachte also einen Haufen mit jmap auf einer Remote-Box und möchte die Speicherbereinigung erzwingen. Wie machst du das, ohne in jvisualvm oder jconsole und Freunde einzutauchen?
Ich weiß, Sie sollten nicht in der Praxis sein, die Speicherbereinigung zu erzwingen - Sie sollten nur herausfinden, warum der Haufen groß ist / wächst.
Mir ist auch klar, dass System.GC () die Speicherbereinigung nicht erzwingt - es teilt dem GC lediglich mit, dass dies geschehen soll.
Gibt es eine Möglichkeit, dies einfach zu tun? Irgendeine Kommandozeilen-App, die mir fehlt?
java
garbage-collection
jmx
jmap
Eyberg
quelle
quelle
Antworten:
Sie können dies über das kostenlose Programm jmxterm tun .
Starten Sie es so:
Von dort aus können Sie eine Verbindung zu einem Host herstellen und GC auslösen:
Informationen zum Einbetten in bash / perl / ruby / other-Skripten finden Sie in den Dokumenten auf der jmxterm-Website. Ich habe dazu popen2 in Python oder open3 in Perl verwendet.
UPDATE: Hier ist ein Einzeiler mit jmxterm:
quelle
Seit JDK 7 können Sie das JDK-Befehlstool 'jcmd' verwenden, z.
jcmd <pid> GC.run
quelle
Explicit GC is disabled, no GC has been performed
, liegt dies möglicherweise am-XX:+DisableExplicitGC
VM-Argument. Siehe: mail.openjdk.java.net/pipermail/serviceability-dev/2017-August/…Wenn Sie ausführen
jmap -histo:live <pid>
, wird ein vollständiger GC auf dem Heap erzwungen, bevor etwas ausgedruckt wird.quelle
jcmd
ist jetzt das richtige Werkzeug für den Job.Ergänzung zur Antwort von user3198490 . Wenn Sie diesen Befehl ausführen, wird möglicherweise die folgende Fehlermeldung angezeigt:
Dies kann mit Hilfe dieser Stackoverflow-Antwort gelöst werden
wo
<process_owner>
ist der Benutzer, der den Prozess mit PID läuft<pid>
. Sie können beide vontop
oder bekommenhtop
quelle
java.io.IOException: Operation not permitted
sudo -u <process_owner> jcmd <pid> GC.run
, könnten Sie es versuchen? Der Befehl sollte sicher seinEs gibt noch ein paar andere Lösungen (viele gute hier schon):
gc()
.gc()
Operation auf der MemoryMBean ausDas folgende Beispiel bezieht sich auf den Befehl cmdline-jmxclient:
Das ist schön, weil es nur eine Zeile ist und Sie es wirklich einfach in ein Skript einfügen können.
quelle
für Linux:
jcmd
wird mit dem JDK gepackt,$(pgrep java)
erhält die Prozess-ID von Javaquelle
Ich glaube nicht, dass es dafür eine Befehlszeilenoption gibt.
Sie müssen dafür jvisualvm / jconsole verwenden.
Ich würde Ihnen eher empfehlen, diese Tools zu verwenden, um zu identifizieren, warum Ihr Programm viel Speicherplatz hat.
Auf jeden Fall sollten Sie GC nicht erzwingen, da dies den GC-Algorithmus sicherlich stören und Ihr Programm verlangsamen würde.
quelle
Wenn Sie jolokia mit Ihrer Anwendung verwenden, können Sie mit diesem Befehl eine Garbage Collection auslösen:
quelle
gerade:
quelle