2011-05-26 123 views
1

今天我們有一個生產java過程被凍結。我們做了一些系統檢查,例如磁盤空間檢查,內存爭用等。我們猜測進程已經死鎖,所以在我們反彈之前,我們在pid上運行了pstack命令。我無法從輸出中解釋很多。我如何閱讀這些日誌?我谷歌搜索堆棧和相關的幫助,但無法獲得太多的信息.​​.如何解釋pstack日誌?

這是堆棧跟蹤的頂部。看起來我們正在等待一個條件?從JNI線程調用DestroyVM危險嗎?

Thread 87 (Thread 0x406a3940 (LWP 18762)): 

#0 0x000000325d60a899 in [email protected]@GLIBC_2.3.2() 
#1 0x00002b6f8fd9177e in os::PlatformEvent::park() 
#2 0x00002b6f8fd67595 in Monitor::IWait() 
#3 0x00002b6f8fd67bfd in Monitor::wait() 
#4 0x00002b6f8fea0295 in Threads::destroy_vm() 
#5 0x00002b6f8fba6eab in jni_DestroyJavaVM() 
#6 0x000000004000223f in JavaMain() 
#7 0x000000325d606367 in start_thread() from /lib64/libpthread.so.0 
#8 0x000000325cad30ad in clone() from /lib64/libc.so.6 

任何指針/幫助非常感謝。謝謝!

+0

運行JMX控制檯沒有幫助。我們所有的都是GC日誌和應用程序日誌(一旦進程凍結,就會突然凍結,應用程序日誌中的所有內容都顯得正常,沒有例外或者其他類似的東西) – Manju 2011-05-26 01:06:04

+0

我認爲您需要發佈整個轉儲。上面的那個可能只是一個已經完成的主要方法,但是在完成之前已經產生了其他非守護進程的線程,因此它正坐在那裏等待所有其他人在它死亡之前死亡。 – Matt 2011-05-26 07:22:01

回答

1

您在此處看到的堆棧來自jvm本身,而不是您的java進程。 不要忘了Java的JVM是一種虛擬器,你的程序的字節碼指令由JVM解釋和執行,JVM只不過是一個C(C++肯定)的程序。

所以我猜這些堆棧中沒有太多的信息可以提取出來,如果允許的話,您應該將Java調試器(jdb?)連接到JVM,以獲得有意義的回溯。