Bir java programını nasıl izleyebilirim?


25

Bir sysadmin olarak bazen bir programın anormal davrandığı durumlarla karşı karşıya kalırken, hiç hata yapmadan ya da saçma hata mesajları oluştururken ortaya çıkar.

Geçmişte - Java gelmeden önce - iki karşı önlem vardı:

  1. Başka hiçbir şey yardımcı olmazsa - RTFM ;-)
  2. 1. bile yardımcı olmuyorsa - sistem çağrılarını izleyin ve neler olduğunu görün

Genellikle strace -fLinux ile bu görev için kullanıyorum (diğer işletim sistemlerinde benzer izleme araçları var). Şimdi bu genellikle herhangi bir eski moda program için işe yararken , bir java işleminde de aynı şeyi yaparken iz çok bulanıklaşıyor . Gerçek bir eylemle alakasız görünen pek çok sistem çağrısı var, böylesi bir çöplüğü aramak korkunç.

Bunu yapmanın daha iyi yolları var mı (eğer kaynak kodu mevcut değilse)?

Yanıtlar:


16

Ckhan'ın bahsettiği gibi harikadır jstackçünkü JVM'deki tüm aktif ipliklerin yığın yığın izini verir. Aynı şey SIGQUIT kullanılarak JVM'nin stderrinde de elde edilebilir.

jmapİşlemin PID'sini kullanarak JVM işleminden bir yığın dökümü kapabilen başka bir faydalı araç :

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

Bu yığın dökümü visualvm(şu anda jvisualvm adlı standart Oracle java sdk kurulumunun bir parçası olan) gibi araçlara yüklenebilir . Ek olarak, VisualVM çalışan JVM'ye bağlanabilir ve dahili CPU kullanım grafiklerini, iş parçacığı sayıları ve yığın kullanımını gösteren - JVM hakkındaki bilgileri görüntüleyebilir - sızıntıları izlemek için harikadır.

Başka bir araç, jstatsayısal bir argümanla (örn. vmstat 3) Çalıştırıldığında, JVM için vmstat'a çok benzeyen bir süre boyunca çöp toplama istatistiklerini toplayabilir .

Son olarak, yükleme sırasında tüm nesnelerin tüm metotlarına enstrümantasyon uygulamak için bir Java Aracısı kullanmak mümkündür. Kütüphane javassistbunu yapmayı çok kolaylaştırmaya yardımcı olabilir. Yani, kendi izini eklemek mümkündür. Bunun zor kısmı, yalnızca istediğiniz zaman izlememe çıktısı elde etmenin bir yolunu bulmak olacaktı; bu, JVM'yi bir taramaya yavaşlatacaktı. dtraceBu şekilde çalışan bir program var . Ben denedim, ama çok başarılı değildi. Ajanların tüm sınıfları enstrümanlayamayacağını unutmayın; çünkü JVM'yi önyüklemek için gerekenler aracının enstrümanından önce yüklenir ve daha sonra bu sınıflara enstrümantasyon eklemek için çok geç.

Önerim - VisualVM ile başlayın ve JVM için güncel konuları ve önemli istatistikleri gösterebileceğinden bunun size bilmeniz gerekenleri söyleyip söylemediğini görün.


Bu arada, bu harika bir soru; Umarım daha fazla insan başka fikirlere cevap ekler İnsanlara Java ile uzun yıllar boyunca izleme konusunda çalıştıklarını sorduğumda bana boş bakışlar verdiler. Belki de sadece strace'ın kötülüğünü bilmiyorlar.
kül

10

Aynı boşuna, bir Linux sisteminde ters giden programların hatalarını ayıklarken, sisteminizde çalışan JVM'leri hata ayıklamak için benzer araçları kullanabilirsiniz.

Araç # 1 - jvmtop

Benzer şekilde top, sisteminizde çalışan JVM'lerde hangi sınıfların neler olduğunu görmek için jvmtop'u kullanabilirsiniz . Kurulduktan sonra böyle çağırırsınız:

$ jvmtop.sh

Çıkışı da benzer şekilde araca benzer şekilde tasarlanmıştır top:

 JvmTop 0.8.0 alpha   amd64  8 cpus, Linux 2.6.32-27, load avg 0.12
 http://code.google.com/p/jvmtop

  PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
 3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46

Araç # 2 - jvmmonitor

Başka bir alternatif jvmmonitor kullanmaktır . JVM Monitor, Java uygulamalarının CPU'sunu, iş parçacıklarını ve bellek kullanımını izlemek için Eclipse ile tümleşik bir Java profilidir. Yerel ana bilgisayarda çalışan JVM'leri otomatik olarak bulmak için kullanabilirsiniz veya bir port @ host kullanarak uzak JVM'lere bağlanabilir.

jvmmonitor ss

Araç # 3 - visualvm

visualvm , JVM ile ilgili sorunları ayıklarken ulaşmanız gereken "araç" tır . Özellik seti oldukça derindir ve iç kısımlara çok derinlemesine bakabilirsiniz.

Uygulama performansını profilleyin veya bellek tahsisini analiz edin:

visualvm # 2'nin ss'si

İplik dökümlerini alın ve görüntüleyin:

# 3 ile sv

Referanslar



2

RHEL OpenJDK kullanıyorsanız (veya benzer, nokta şu ki Oracle'ın JDK'sı değil), bunun için SystemTap kullanabilirsiniz .

Bazı sondalar java komut satırı seçeneklerini kullanarak etkindir -XX:+DTraceMethodProbes, -XX:+DTraceAllocProbes, -XX:+DTraceMonitorProbes. Bu probların etkinleştirilmesinin program performansını önemli ölçüde etkileyeceğini unutmayın.

Örnek SystemTap Komut Dosyası:

#!/usr/bin/stap

probe hotspot.class_loaded {
    printf("%12s [???] %s\n", name, class);
}

probe hotspot.method_entry, 
      hotspot.method_return {
    printf("%12s [%3d] %s.%s\n", name, thread_id, class, method);
}

probe hotspot.thread_start, 
      hotspot.thread_stop {
    printf("%12s [%3d] %s\n", name, id, thread_name);
}

probe hotspot.monitor_contended_enter, 
      hotspot.monitor_contended_exit {
    printf("%12s [%3d] %s\n", name, thread_id, class);
}

jstack()Java'nın işlem yığınını almak için de kullanabilirsiniz , ancak bu yalnızca JVM'den önce SystemTap'i başlattığınızda çalışır .


SystemTap'in her yöntemi izleyeceğini unutmayın . Ayrıca yöntemin argümanlarını da elde edemez. Diğer bir seçenek ise JVM, JVMTI adı verilen kendi izleme yeteneklerini kullanmaktır. En ünlü JVMTI uygulamalarından biri BTrace'dir .


0

Yöntem girişini izlemenizi ve kod değişikliği veya yeniden konuşlandırma yapmadan çıkmanızı sağlayan bir JVM izleme aracı olan Jackplay'i denemeniz önerilir .


Çalışan bir JVM'ye ekleyemezsiniz. Bunun dışında - ilginç bir araç
Nils
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.