java thread dökümü almak için -3'ü öldür


116

Ben kullanıyorum kill -3JVM'nin unix'teki iş parçacığı dökümünü görmek için komut . Ama bu killkomutun çıktısını nerede bulabilirim ? Kayboldum !!


Hangi süreci öldürüyorsunuz? Bir J2EE uygulama sunucusu mu? Durum buysa, standart çıkışta yığın izini bulmalısınız.
Luciano Fiandesio

Java sınıfını çalıştıran bir işlemi öldürüyorum
javanerd

2
Konsola iş parçacığı dökümü yazmamalıdır. java sınıfı standart olarak konsola sahip olduğundan
javanerd

Yanıtlar:


194

Bir iş parçacığı dökümü almak ve çıktıyı istediğiniz yere yazmak için alternatif olarak jstack'i (JDK ile birlikte verilir) kullanabilirsiniz. Bu bir unix ortamında mevcut değil mi?

jstack PID > outfile

1
Evet - çalıştırıldığı anda. Ek kilit bilgileri yazdıran uzun bir liste için -l (küçük L) de belirtebilirsiniz
Joshua McKinnon

2
Jstack komutu "
Adresten

1
Bu hatayı görüyorsanız, bunu satıcınızla görüşmenizi öneririm. Hızlı bir arama, örneğin, RHEL'de bu hata ve openjdk ile ilgili açık bir hata olduğunu gösterir ...
Joshua McKinnon

7
Jstack'in JDK gerektirdiğini belirtmek gerekir. Uygulamaları yalnızca JRE'nin yüklü olduğu bir sunucuda çalıştırıyorsanız, iş parçacığı dökümü için başka bir yol bulmanız gerekir.
jeffkempf

1
Windows hizmeti gibi farklı bir kullanıcı altında çalışan bir işlemin iş parçacığı dökümünü elde etmek için jstack'i nasıl kullanacağınız aşağıda açıklanmıştır: stackoverflow.com/questions/1197912/…
Vadzim

44

İş parçacığı dökümü, üzerinde çalıştırdığınız VM'den sisteme yazılır kill -3. JVM'nin konsol çıktısını bir dosyaya yeniden yönlendiriyorsanız, iş parçacığı dökümü o dosyada olacaktır. JVM açık bir konsolda çalışıyorsa, iş parçacığı dökümü konsolunda görüntülenecektir.


1
JVM iş parçacığı dökümü çıktısını ayrı bir dosyaya yeniden yönlendirmenin bir yolu vardır. Cevabıma bakın.
Vadzim

32

Kesme sinyali üzerindeki JVM iş parçacığı dökümü çıktısını LogVMOutput tanılama seçeneği ile ayrı bir dosyaya yönlendirmenin bir yolu vardır :

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log

5
Teknik olarak bu, iş parçacığı dökümü çıktısını "yeniden yönlendirmez". Jvm.log'da (iş parçacığı dökümü çıktısını içerir) JVM oturum açmasını açar, ancak kill -QUIT yine de sürecin stdout'una (aswell) dökülür. Belirsiz JVM seçeneklerinin açıklaması için oy verildi :)
sqweek

25

Resimde Java 8 ile jcmdtercih edilen yaklaşım budur.

jcmd <PID> Thread.print

Oracle belgelerinden kod parçacığı aşağıdadır :

JDK 8 sürümü, JVM ve Java uygulamalarıyla ilgili sorunları tanılamak için Java Mission Control, Java Flight Recorder ve jcmd yardımcı programını tanıttı. Gelişmiş tanılama ve düşük performans ek yükü için önceki jstack yardımcı programı yerine en yeni yardımcı program olan jcmd'nin kullanılması önerilir.

Ancak, bunu uygulamayla birlikte göndermek, emin olmadığım lisanslama sonuçları olabilir.


1
Ne yazık ki , başarılı olurken jcmdWindows hizmet sürecine bağlanamıyor : stackoverflow.com/questions/1197912/…com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attachjstack -F
Vadzim

1
Java işleminin yaptığı gibi aynı kullanıcı altında jcmd <pid> Thread.dump çalıştırmanız gerekir, aksi takdirde bağlantılarınız kesilir. Stackoverflow.com/questions/25438983/… sayfasına
Twilite

11

JVM'nin standart çıkışının yerleştirildiği aynı konumda. Bir Tomcat sunucunuz varsa, catalina_(date).outdosya bu olacaktır .


8

Kill -3'ü kullanırken standart çıktıda iş parçacığı dökümü görmelisiniz. Uygulama sunucularının çoğu standart çıktıyı ayrı bir dosyaya yazar. Kill -3'ü kullanırken orada bulmalısınız. İş parçacığı dökümlerini almanın birden çok yolu vardır:

  • kill -3 <PID>: Standart çıktıya çıktı verir.
  • Sunucunun çalıştığı konsol penceresine erişiminiz varsa , STDOUT üzerinde yığın izlemesi oluşturmak için Ctrl+ Breaktuş kombinasyonu kullanılabilir .
  • Hotspot sanal makineleri jstackiçin, bir iş parçacığı dökümü oluşturmak için komutu da kullanabiliriz . JDK'nın bir parçası. Sözdizimi aşağıdaki gibidir:

    Usage:
    
    jstack [-l] <pid> (to connect to running process)
    jstack -F [-m] [-l] <pid>(to connect to a hung process)
    
     - For JRockit JVM we can use JRCMD command which comes with JDK Syntax: 
       jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]

Kill -3 <PID> kullanımında sorun yaşıyorum. Tamam çalışıyor ancak konsola iş parçacığı dökümü yazdıktan sonra işlemi de sonlandırıyor. Bunu yapması mı gerekiyor?
Ashley

@Ashley - hayır JVM'yi kill -3 <PID>öldürmemeli. Ne tür bir Java uygulamasına bakıyorsunuz?
slm

2

Jboss'ta şunları yapabilirsiniz:

nohup $JBOSS_HOME/bin/run.sh -c  yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out  2>&1 < /dev/null &
kill -3 <java_pid>

Bu, çıktınızı / iş parçacığınızı yukarıdaki komutta belirtilen dosya konsoluna yönlendirecektir.



2

StandAlone Java İşleminizin iş parçacığı dökümünü istiyorsanız izlemeniz gereken adımlar

Adım 1: Java programını çağıran kabuk betiği için İşlem Kimliğini alın

linux$ ps -aef | grep "runABCD"

user1  **8535**  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17796 17372   0 08:15:41 pts/49      0:00 grep runABCD

Adım 2: runABCD tarafından Çağrılan Çocuk için İşlem Kimliğini alın. Çocukları almak için yukarıdaki PID'yi kullanın.

linux$ ps -aef | grep **8535**

user1  **8536**  8535   0   Mar 25 ?         126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer

user1  8535  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17977 17372   0 08:15:49 pts/49      0:00 grep 8535

3. Adım: Belirli işlem için JSTACK'i edinin. XYSServer işleminizin İşlem kimliğini alın. yani 8536

linux$ jstack **8536** > threadDump.log
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.