Tak więc patrzę na stertę z jmap na zdalnym pudełku i chcę wymusić na niej zbieranie śmieci. Jak to zrobić bez zaglądania do jvisualvm lub jconsole i przyjaciół?
Wiem, że nie powinieneś ćwiczyć wymuszania zbierania śmieci - powinieneś po prostu dowiedzieć się, dlaczego sterta jest duża / rośnie.
Zdaję sobie również sprawę, że System.GC () w rzeczywistości nie wymusza czyszczenia pamięci - po prostu mówi GC, że chcesz, aby to nastąpiło.
Powiedziawszy, że można to łatwo zrobić? Brakuje mi jakiejś aplikacji wiersza poleceń?
java
garbage-collection
jmx
jmap
eyberg
źródło
źródło
Odpowiedzi:
Możesz to zrobić za pomocą bezpłatnego programu jmxterm .
Odpal to tak:
Stamtąd możesz połączyć się z hostem i uruchomić GC:
Zajrzyj do dokumentacji na stronie jmxterm, aby uzyskać informacje na temat osadzania tego w skryptach bash / perl / ruby / innych. Użyłem do tego popen2 w Pythonie lub open3 w Perlu.
AKTUALIZACJA: oto jedna linijka wykorzystująca jmxterm:
źródło
Od JDK 7 możesz użyć narzędzia poleceń JDK „jcmd”, takiego jak:
jcmd <pid> GC.run
źródło
Explicit GC is disabled, no GC has been performed
, może to być spowodowane-XX:+DisableExplicitGC
argumentem VM. Zobacz: mail.openjdk.java.net/pipermail/serviceability-dev/2017-August/…Jeśli uruchomisz
jmap -histo:live <pid>
, wymusi to pełny GC na stercie, zanim cokolwiek wydrukuje.źródło
jcmd
Jest teraz odpowiednim narzędziem do tego zadania.Dodatek do user3198490 odpowiedź „s. Uruchomienie tego polecenia może spowodować wyświetlenie następującego komunikatu o błędzie:
Można to rozwiązać za pomocą tej odpowiedzi na temat przepełnienia stosu
gdzie
<process_owner>
jest użytkownikiem, który uruchamia proces z PID<pid>
. Możesz uzyskać oba ztop
lubhtop
źródło
java.io.IOException: Operation not permitted
sudo -u <process_owner> jcmd <pid> GC.run
, czy mógłbyś spróbować? Polecenie powinno być bezpieczneJest kilka innych rozwiązań (już tutaj wiele dobrych):
gc()
.gc()
operację na MemoryMBeanPoniższy przykład dotyczy cmdline-jmxclient:
Jest to fajne, ponieważ jest to tylko jedna linia i można ją bardzo łatwo umieścić w skrypcie.
źródło
dla linuxa:
jcmd
jest spakowany z JDK,$(pgrep java)
pobiera identyfikator procesu javaźródło
Myślę, że nie ma opcji wiersza poleceń do tego samego.
Będziesz musiał użyć jvisualvm / jconsole do tego samego.
Raczej zasugerowałbym ci użycie tych narzędzi do identyfikacji, dlaczego twój program ma dużo pamięci.
W każdym razie nie powinieneś wymuszać GC, ponieważ z pewnością zakłóciłoby to algorytm GC i spowolniłoby program.
źródło
Jeśli używasz jolokii w swojej aplikacji, możesz wyzwolić czyszczenie pamięci za pomocą tego polecenia:
źródło
właśnie:
źródło