簡體   English   中英

如何解釋Java線程轉儲?

[英]How to interpret a Java thread dump?

我在運行Ubuntu(服務器版)的Tomcat6上獲得了一個Java Web應用程序。 1-3天后,應用程序變得非常慢,因此在重新啟動tomcat之后創建了一個線程轉儲,當應用程序開始變得緩慢時又創建了一個:

重新啟動后的Threaddump:

3天后進行Threaddump(現在應用程序運行緩慢):

從我發布的轉儲中,我可以看到有很多線程由於某種原因似乎沒有終止。 不幸的是,我無法分辨出哪個(類名?)以及為什么。 在控制台上使用top表示“ VIRT”的值從〜800(重新啟動后)增加到超過4000(3天后)。

我如何更好地解釋這些轉儲? 我已經嘗試將它們加載到TDA中,但這沒有用(TDA似乎沒有將它們識別為轉儲)。

也許有人已經在轉儲中看到了什么情況?

在jstack文本文件中,我看到BCI(字節碼解釋器)中掛着許多線程,可能正在解釋您的代碼。 它似乎沒有表明它在代碼中的解釋位置。

確實說您處於死鎖狀態。

在.out文件中,我尋找了看起來像應用程序代碼的東西。 我看到它掛在

  • EventProcessingThreadImpl.run:479(2個線程)

  • GC中的GC.java:100(1個線程)等待釋放某些內容,以便GC可以繼續進行。

  • 在ThreadPoolExecutor.java:907中,許多線程停在不安全的狀態下,拿着一個同步器,試圖讀取作業隊列。

  • 我還看到了看起來很簡單的東西-等待執行工作的線程,可運行的線程,等待郵件等。

這有什么幫助嗎?

添加:

好的,我搜索了您的代碼,並在三個線程中找到了它,如下所示,在每個線程的下面都給出了一個初步的解釋。

(另外,請注意此鏈接有關使用jstack查找死鎖 。)

----------------- 20607 -----------------
__pthread_cond_wait + 0xcc
_ZN13ObjectMonitor4waitElbP6Thread + 0x60a
_ZN18ObjectSynchronizer4waitE6HandlelP6Thread + 0x53
JVM_MonitorWait + 0x1e7
<Unknown compiled code>
* java.lang.Object.wait() bci:2 line:485 (Interpreted frame)
* org.zkoss.zk.ui.impl.EventProcessingThreadImpl.doSuspend0(java.lang.Object) bci:143 line:219 (Interpreted frame)
* org.zkoss.zk.ui.impl.EventProcessingThreadImpl.doSuspend(java.lang.Object) bci:7 line:185 (Interpreted frame)
* org.zkoss.zk.ui.impl.UiEngineImpl.wait(java.lang.Object) bci:198 line:1471 (Interpreted frame)
* org.zkoss.zk.ui.Executions.wait(java.lang.Object) bci:4 line:702 (Interpreted frame)
* org.zkoss.zul.Window.enterModal() bci:22 line:619 (Interpreted frame)
* org.zkoss.zul.Window.doModal() bci:67 line:551 (Interpreted frame)
* org.zkoss.zul.Messagebox.show(java.lang.String, java.lang.String, int, java.lang.String, int,     org.zkoss.zk.ui.event.EventListener) bci:343 line:274 (Interpreted frame)
* org.zkoss.zul.Messagebox.show(java.lang.String, java.lang.String, int, java.lang.String) bci:6 line:128 (Interpreted frame)
* com.smampi.web.view.client.ClientController$5.onEvent(org.zkoss.zk.ui.event.Event) bci:8 line:417 (Interpreted frame)
* org.zkoss.zk.ui.impl.EventProcessor.process0(org.zkoss.zk.ui.ext.Scope) bci:384 line:192 (Compiled frame)
????????

線程20607位於com.smampi.web.view.client.ClientController $ 5.onEvent第128行(我在猜測)。 它正在顯示一個模式消息框,並等待其被回答。

----------------- 20878 -----------------
__pthread_cond_wait + 0xcc
_ZN13ObjectMonitor4waitElbP6Thread + 0x60a
_ZN18ObjectSynchronizer4waitE6HandlelP6Thread + 0x53
JVM_MonitorWait + 0x1e7
<Unknown compiled code>
* java.lang.Object.wait() bci:2 line:485 (Interpreted frame)
* org.zkoss.zk.ui.impl.EventProcessingThreadImpl.doSuspend0(java.lang.Object) bci:143 line:219 (Interpreted frame)
* org.zkoss.zk.ui.impl.EventProcessingThreadImpl.doSuspend(java.lang.Object) bci:7 line:185 (Interpreted frame)
* org.zkoss.zk.ui.impl.UiEngineImpl.wait(java.lang.Object) bci:198 line:1471 (Interpreted frame)
* org.zkoss.zk.ui.Executions.wait(java.lang.Object) bci:4 line:702 (Interpreted frame)
* org.zkoss.zul.Window.enterModal() bci:22 line:619 (Interpreted frame)
* org.zkoss.zul.Window.doModal() bci:67 line:551 (Interpreted frame)
* org.zkoss.zul.Messagebox.show(java.lang.String, java.lang.String, int, java.lang.String, int, org.zkoss.zk.ui.event.EventListener) bci:343 line:274 (Interpreted frame)
* org.zkoss.zul.Messagebox.show(java.lang.String, java.lang.String, int, java.lang.String) bci:6 line:128 (Interpreted frame)
* com.smampi.web.view.client.ClientController$5.onEvent(org.zkoss.zk.ui.event.Event) bci:8 line:417 (Interpreted frame)
* org.zkoss.zk.ui.impl.EventProcessor.process0(org.zkoss.zk.ui.ext.Scope) bci:384 line:192 (Compiled frame)
????????

線程20878也顯示了一個消息框,但在第417行(我猜是)

----------------- 22792 -----------------
__pthread_cond_wait + 0xcc
_ZN7Monitor5ILockEP6Thread + 0xb9
_ZN7Monitor4lockEP6Thread + 0xf2
_ZN7Monitor4lockEv + 0x28
_ZN18GenCollectorPolicy17mem_allocate_workEmbPb + 0xca
_ZN16GenCollectedHeap12mem_allocateEmbbPb + 0x38
_ZN13CollectedHeap26common_mem_allocate_noinitEmbP6Thread + 0x9a
_ZN13instanceKlass17allocate_instanceEP6Thread + 0x7d
_ZN18InterpreterRuntime4_newEP10JavaThreadP19constantPoolOopDesci + 0xda
* com.sun.mail.util.SocketFetcher.startTLS(java.net.Socket, java.lang.String, java.util.Properties, java.lang.String) bci:378 line:413 (Interpreted frame)
* com.sun.mail.iap.Protocol.startTLS(java.lang.String) bci:23 line:377 (Interpreted frame)
* com.sun.mail.imap.protocol.IMAPProtocol.startTLS() bci:3 line:734 (Interpreted frame)
* com.sun.mail.imap.IMAPStore.login(com.sun.mail.imap.protocol.IMAPProtocol, java.lang.String, java.lang.String) bci:24 line:676 (Interpreted frame)
* com.sun.mail.imap.IMAPStore.protocolConnect(java.lang.String, int, java.lang.String, java.lang.String) bci:343 line:643 (Interpreted frame)
* javax.mail.Service.connect(java.lang.String, int, java.lang.String, java.lang.String) bci:380 line:295 (Interpreted frame)
* com.smampi.web.model.mail.server.MailServer.connect() bci:427 line:514 (Interpreted frame)
* com.smampi.web.model.mail.server.MailServer$1.closed(javax.mail.event.ConnectionEvent) bci:10 line:593 (Interpreted frame)
* javax.mail.event.ConnectionEvent.dispatch(java.lang.Object) bci:55 line:96 (Interpreted frame)

線程22792試圖從com.smampi.web.model.mail.server.MailServer.connect行514建立郵件服務連接,而這是從com.smampi.web.model.mail.server.MailServer $ 1.closed調用的在第593行。為此,它似乎正在等待另一個線程停止垃圾收集,因此它可以為新線程分配內存,因此可以執行“ startTLS”(用於將純文本鏈接升級為加密的鏈接),它可以進行郵件服務連接。

這說明什么了嗎?

我看到大量嘗試建立SSL上下文的線程:

"JavaMail-EventQueue" daemon prio=10 tid=0x00007f9f10416000 nid=0x54c6 waiting for monitor entry [0x00007f9e3e92d000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at sun.security.provider.NativePRNG$RandomIO.implNextBytes(NativePRNG.java:255)
    - waiting to lock  (a java.lang.Object)
    at sun.security.provider.NativePRNG$RandomIO.access$200(NativePRNG.java:108)
    at sun.security.provider.NativePRNG.engineNextBytes(NativePRNG.java:97)
    at java.security.SecureRandom.nextBytes(SecureRandom.java:433)
    - locked  (a java.security.SecureRandom)
    at java.security.SecureRandom.next(SecureRandom.java:455)
    at java.util.Random.nextInt(Random.java:189)
    at com.sun.net.ssl.internal.ssl.SSLContextImpl.engineInit(SSLContextImpl.java:82)
    at javax.net.ssl.SSLContext.init(SSLContext.java:248)
    at com.sun.mail.util.MailSSLSocketFactory.newAdapteeFactory(MailSSLSocketFactory.java:130)
    - locked  (a com.sun.mail.util.MailSSLSocketFactory)
    at com.sun.mail.util.MailSSLSocketFactory.(MailSSLSocketFactory.java:119)
    at com.sun.mail.util.MailSSLSocketFactory.(MailSSLSocketFactory.java:94)
    at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:413)
    at com.sun.mail.iap.Protocol.startTLS(Protocol.java:377)
    - locked  (a com.sun.mail.imap.protocol.IMAPProtocol)
    at com.sun.mail.imap.protocol.IMAPProtocol.startTLS(IMAPProtocol.java:734)
    at com.sun.mail.imap.IMAPStore.login(IMAPStore.java:676)
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:643)
    - locked  (a com.sun.mail.imap.IMAPStore)
    at javax.mail.Service.connect(Service.java:295)
    - locked  (a com.sun.mail.imap.IMAPStore)
    at com.smampi.web.model.mail.server.MailServer.connect(MailServer.java:514)
    at com.smampi.web.model.mail.server.MailServer$1.closed(MailServer.java:593)
    at javax.mail.event.ConnectionEvent.dispatch(ConnectionEvent.java:96)
    at javax.mail.EventQueue.run(EventQueue.java:134)
    at java.lang.Thread.run(Thread.java:662)

我經常看到服務器在SSL設置過程中(無論是作為服務器還是作為客戶端)變得異常緩慢,這是因為操作系統的可用熵變得非常低(例如,操作系統無法生成高質量的隨機數)更多)。

嘗試使用以下命令顯示/proc/sys/kernel/random/entropy_avail

cat /proc/sys/kernel/random/entropy_avail

這應該告訴您操作系統目前可以提供多少隨機數據, 通常至少應該雜亂無章的。 如果它始終為0或非常接近,則您會遇到問題,需要引入另一個熵源。

再一次,它也可能是相反的:該連接的另一端可能在收集熵時遇到問題,並且回答速度可能很慢。

您正在等待狀態中有很多 (數千個)線程。 在這里閱讀有關各種線程狀態的信息: http : //download.oracle.com/javase/1,5,0/docs/api/java/lang/Thread.State.html

這是個問題。 您需要找到為什么您的應用程序創建了這么多線程而不破壞它們的原因。

您還有許多名為“ JavaMail-EventQueue”的線程。 找出為什么郵件生命周期未完成。 在使用JavaMail時添加一些日志記錄語句,您可能會經常發現一些未完成的操作。

我的猜測是,您不小心嘗試將TLS(加密)與不期望加密流量的服務進行通信,因此您有許多線程在等待正確的響應,而這些響應永遠不會出現。

您確定您為此服務使用了正確的端口號嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM