Czy istnieje narzędzie wiersza polecenia (Linux) do sprawdzania rozmiaru sterty (i używanej pamięci) aplikacji Java?
Próbowałem przez jmap. Ale daje informacje. o obszarach pamięci wewnętrznej, takich jak Eden / PermGen itp., co nie jest dla mnie przydatne.
Szukam czegoś takiego:
- Maksymalna pamięć: 1 GB
- Minimalna pamięć: 256 MB
- Pamięć sterty: 700 MB
- Używana pamięć: 460 MB
To wszystko. Wiem, że widzę to w JConsole itp., Ale potrzebuję narzędzia wiersza poleceń (nie mogę włączyć JMX itp.)
Czy znasz takie narzędzie / polecenie?
jstat
należy użyć, aby zweryfikować tylko ogólne użycie pamięci maszyny JVM? Powiedzmy, że uruchamiasz maszynę JVM odXms=4g
iXmx=4g
i chcesz sprawdzić, ile pamięci jest już używane?jstat
Oracle Java 8 Podręcznik stronie :This command is experimental and unsupported
.awk 'print {$3+$4+$6+$8}'
można wydrukować podsumowanie użycia w kolumnach jstat Javy 8ps -ef | grep java
pokazał mi argumenty vm, które w moim przypadku zawierały wartość -Xmx, która była wszystkim, czego potrzebowałem.jvmtop to narzędzie wiersza poleceń, które zapewnia podgląd na żywo kilku wskaźników, w tym sterty.
Przykładowe dane wyjściowe trybu przeglądu VM:
źródło
To polecenie wyświetla skonfigurowane rozmiary sterty w bajtach.
Działa również na Amazon AMI na EC2.
źródło
Wypróbuj to zadziałało w Ubuntu i RedHat:
Dla Windowsa:
Dla Maca
Dane wyjściowe wszystkich tych poleceń przypominają poniższe:
Aby znaleźć rozmiar w MB, podziel wartość przez (1024 * 1024).
źródło
jstat -gc <vmid>
do uruchamiania aplikacji.Bez używania JMX, którego używa większość narzędzi, jedyne, co możesz zrobić, to użyć
i wywnioskować, że ustawienia będą pochodzić z opcji wiersza poleceń.
Domyślnie nie możesz uzyskać dynamicznych informacji bez JMX, ale możesz napisać własną usługę, aby to zrobić.
BTW: Wolę używać VisualVM zamiast JConsole.
źródło
Istnieje narzędzie wiersza poleceń z aspektem wizualnym - jvm-mon . Jest to narzędzie do monitorowania maszyny JVM dla wiersza poleceń, które źle znosi:
Metryki i wykresy są aktualizowane, gdy narzędzie jest otwarte.
Próba:
źródło
Spóźniona impreza, ale bardzo prostym rozwiązaniem jest użycie skryptu jpsstat.sh. Zapewnia prostą aktualną pamięć , maksymalną pamięć i szczegóły użycia procesora .
Oto przykładowe wyjście skryptu -
źródło
W moim przypadku musiałem sprawdzić flagi wewnątrz kontenera docker, który nie miał większości podstawowych narzędzi (ps, pstree ...)
Używając
jps
, otrzymałem PID uruchomionej maszyny JVM (w moim przypadku 1), a następniejcmd 1 VM.flags
otrzymałem flagi z uruchomionej maszyny JVM.To zależy od dostępnych poleceń, ale może to komuś pomóc. :)
źródło
Z Java8 i nowszych możesz użyć poniższego polecenia:
jcmd
JAVA_PROCESS_ID
GC.heap_infoMożesz odwołać się do sumy, całkowitej i używanej pamięci z wyjścia.
Aby uzyskać więcej informacji na temat polecenia jcmd, odwiedź link: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
źródło
GC.heap_info
jest zdecydowanie dostępne również w OpenJDK 8. Może tylko w najnowszych wersjach? Używam tego: 8u191-b12-2ubuntu0.18.04.1Każde podejście powinno dać mniej więcej taką samą liczbę. Zawsze dobrze jest przydzielić stertę
-X..m
-X..x
dla wszystkich pokoleń. Możesz wtedy zagwarantować, a także zrobić ps, aby zobaczyć, jakie parametry zostały przekazane, a zatem są używane.W przypadku rzeczywistego wykorzystania pamięci można z grubsza porównać VIRT (przydzielone i współdzielone) i RES (faktycznie używane) w porównaniu z wartościami jstat:
W przypadku języka Java 8 zobacz jstat, gdzie te wartości faktycznie oznaczają. Zakładając, że uruchamiasz prostą klasę bez mmap lub przetwarzania plików.
Maks . :
(mniej więcej blisko i poniżej pamięci VIRT)
Max (min, używane):
(z grubsza zbliżone do pamięci RES)
„Nie cytuj mnie w tej sprawie”, ale VIRT mem jest mniej więcej blisko lub więcej niż przydzielona maksymalna ilość pamięci, ale dopóki używana pamięć jest wolna / dostępna w pamięci fizycznej, JVM nie zgłasza wyjątku pamięci. W rzeczywistości maksymalna pamięć nie jest nawet porównywana z pamięcią fizyczną podczas uruchamiania maszyny JVM, nawet przy wyłączonej wymianie w systemie operacyjnym. Lepsze wyjaśnienie tego, jaka pamięć wirtualna naprawdę jest używana przez proces Java, jest omówione tutaj .
źródło
Najpierw uzyskaj identyfikator procesu, pierwszą liczbę z wymienionego procesu, z jednego z następujących: (lub po prostu użyj
ps aux | grep java
, jeśli wolisz)Następnie użyj tutaj identyfikatora procesu:
źródło
Użycie
top
polecenia to najprostszy sposób sprawdzenia wykorzystania pamięci programu.RES
kolumna pokazuje rzeczywistą pamięć fizyczną zajmowaną przez proces.W moim przypadku odczytałem plik 10g w Javie i za każdym razem, gdy otrzymałem wyjątek outOfMemory. Stało się tak, gdy wartość w
RES
kolumnie osiągnęła wartość ustawioną w-Xmx
opcji. Następnie poprzez zwiększenie pamięci za pomocą-Xmx
opcji wszystko poszło dobrze.źródło
Jeśli chodzi o rozmiar sterty Java, w systemie Linux można użyć
lub
i poszukaj -Xms, -Xmx, aby dowiedzieć się o początkowej i maksymalnej określonej wielkości sterty.
Jeśli jednak dla interesującego procesu Java nie ma opcji -Xms lub -Xmx, oznacza to, że proces Java używa domyślnych rozmiarów sterty. Możesz użyć następującego polecenia, aby znaleźć domyślne rozmiary.
lub konkretny plik jvm, na przykład
i poszukaj InitialHeapSize i MaxHeapSize, które są w bajtach.
źródło
Jeśli używasz jrockit, wypróbuj narzędzie wiersza poleceń jrcmd. Na przykład:
Aby uzyskać więcej poleceń, takich jak heap_diagnostics, użyj „jrcmd help”, aby je wyświetlić.
https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t
źródło
Przykładowe O / P powyższego polecenia
Więcej informacji na ten temat można znaleźć pod adresem http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
źródło
Do tej pory nie ma takiego narzędzia do drukowania pamięci sterty w formacie, o który prosiłeś Jedynym i jedynym sposobem drukowania jest napisanie programu java przy pomocy Runtime Class ,
}
źródło: https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-java-runtime/
źródło
Znajdź identyfikator procesu swojego procesu webapp / java od góry. Użyj sterty jmap, aby uzyskać alokację sterty. Przetestowałem to na AWS-Ec2 dla elastycznej łodygi fasoli
Możesz zobaczyć na obrazku poniżej maksymalne sterty 3 GB dla aplikacji
źródło