如何解释Java线程转储?

时间:2011-10-04 13:22:11

标签: java thread-dump

我在这里使用Ubuntu(服务器版)在Tomcat6上运行了一个Java Web应用程序。 1-3天之后,应用程序变得非常慢,所以我在重新启动tomcat之后创建了一个threaddump,当应用程序开始变慢时我创建了另一个:

重新启动后的Threaddump:

3天后的Threaddump(申请现在很慢):

从我发布的转储中,我可以看到有很多线程由于某种原因似乎没有终止。不幸的是,我不知道哪些(类名?)和原因。在控制台上使用top显示" VIRT"的值从大约800(重启后)上升到超过4000(3天后)。

如何更好地解释这些转储?我已经尝试将它们加载到TDA中,但这不起作用(TDA似乎不会将它们识别为转储)。

也许某人已经在转储中看到了什么?

4 个答案:

答案 0 :(得分:5)

在jstack文本文件中,我看到许多线程挂在BCI(字节代码解释器)中,可能会解释您的代码。 它似乎没有表明你的代码在哪里解释。

确实说你有死锁情况。

在.out文件中,我查找了应用程序代码。我看到它挂在

  • EventProcessingThreadImpl.run:479(2个主题)

  • GC中的GC.java:100(1个线程)正在等待释放某些内容,以便GC可以继续。

  • 许多线程停在一个不安全的状态,持有同步器,尝试读取一个作业队列,在ThreadPoolExecutor.java:907

  • 我也看到了很多样板 - 线程等待工作,线程可运行,等待邮件等。

这有任何帮助吗?

<强>加了:

好的,我搜索了你的代码并在三个线程上找到了它,如图所示,在每个线程下面我给出了一个初步的解释。

(另请注意this link about using jstack to find deadlocks。)

----------------- 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调用该服务在第593行收到1. $。 为此,看起来它正在等待另一个线程停止垃圾收集,因此它可以为新线程分配内存,以便它可以执行“startTLS”(用于将纯文本链接升级到加密线程),这样它就可以执行邮件服务连接。

这有什么亮点吗?

答案 1 :(得分:0)

我看到很多线程试图建立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或非常接近,那么你就遇到了问题,需要引入另一个熵源。

然后它也可能是另一种方式:该连接的其他端可能在收集熵时遇到问题,并且可能回答缓慢。

答案 2 :(得分:0)

你在WAITING状态下有批次(数千?)的线程。在这里阅读各种线程状态:http://download.oracle.com/javase/1,5,0/docs/api/java/lang/Thread.State.html

这是一个问题。您需要找到为什么您的应用创建了如此多的线程而不是销毁它们。

你还有很多的线程名为“JavaMail-EventQueue”。找出邮件生命周期未完成的原因。在您使用JavaMail时添加一些日志记录语句,您可能会发现某些操作经常无法完成。

答案 3 :(得分:0)

我的猜测是,你意外地尝试将TLS(加密)与不期望加密流量的服务对话,因此你有许多线程在等待从未到来的正确响应。

您确定使用的是此服务的正确端口号吗?