GNU/Linux >> Znalost Linux >  >> Linux

Linux – Jak sledovat program Java?

Jako správce systému se někdy setkávám se situacemi, kdy se program chová abnormálně, přičemž vůbec nevytváří chyby nebo vytváří nesmyslné chybové zprávy.

V minulosti – než se objevila java – existovala dvě protiopatření:

  1. Pokud nic jiného nepomůže – RTFM 😉
  2. Pokud ani 1. nepomůže – sledujte systémová volání a zjistěte, co se děje

Obvykle používám strace -f pro tuto úlohu s Linuxem (jiné OS mají podobné nástroje pro sledování). I když to obvykle funguje dobře pro jakýkoli staromódní program, trasování je velmi neostré, když totéž uděláte na javě -proces. Existuje tolik systémových volání, která zdánlivě nesouvisejí s žádnou skutečnou akcí, že je hrozné prohledávat takovou skládku.

Existují lepší způsoby, jak toho dosáhnout (pokud zdrojový kód není k dispozici)?

Přijatá odpověď:

Jak zmínil ckhan, jstack je skvělé, protože poskytuje úplnou stopu zásobníku všech aktivních vláken v JVM. Totéž lze získat na stderr JVM pomocí SIGQUIT.

Dalším užitečným nástrojem je jmap který dokáže zachytit výpis haldy z procesu JVM pomocí PID procesu:

jmap -dump:file=/tmp/heap.hprof $PID

Tento výpis haldy lze načíst v nástrojích jako visualvm (který je nyní součástí standardní instalace Oracle java sdk s názvem jvisualvm). Kromě toho se VisualVM může připojit k běžícímu JVM a zobrazovat informace o JVM, včetně zobrazení grafů interního využití CPU, počtu vláken a využití haldy – skvělé pro sledování úniků.

Další nástroj, jstat , může shromažďovat statistiky garbage collection pro JVM po určitou dobu, podobně jako vmstat, když je spuštěn s číselným argumentem (např. vmstat 3 ).

A konečně je možné použít Java Agent k prosazení instrumentace na všechny metody všech objektů při načítání. Knihovna javassist může pomoci, aby to bylo velmi snadné. Je tedy možné přidat vlastní trasování. Nejtěžší na tom by bylo najít způsob, jak získat výstup trasování pouze tehdy, když to chcete, a ne pořád, což by pravděpodobně zpomalilo JVM na procházení. Existuje program s názvem dtrace který funguje takovým způsobem. Zkoušel jsem to, ale nebyl moc úspěšný. Všimněte si, že agenti nemohou instrumentovat všechny třídy, protože ty potřebné k bootstrap JVM jsou načteny dříve, než může agent instrumentovat, a pak je příliš pozdě na přidání instrumentace do těchto tříd.

Související:Linux – Najít podřetězec v souborech napříč podadresáři pomocí jediného vestavěného příkazu?

Můj návrh – začněte s VisualVM a zjistěte, zda vám to řekne, co potřebujete vědět, protože může zobrazit aktuální vlákna a důležité statistiky pro JVM.


Linux
  1. Jak nainstalovat Python na Linux

  2. Jak používám cron v Linuxu

  3. Jak nainstalovat Javu na Linux

  1. Jak používat BusyBox na Linuxu

  2. Jak rozdělit disk v Linuxu

  3. Jak používat Su Command v Linuxu

  1. Jak nainstalovat Linux ve 3 krocích

  2. Jak přesunout soubor v Linuxu

  3. Jak sledovat IO operace jednotlivých souborů v Linuxu?