2011-11-10 50 views
24

我注意到我的java应用程序(在tomcat6上运行)产生了很多不终止的线程。找到等待/睡眠线程的原因

所以我创建了一个线程转储,发现有吨等待的线程,就像这样:

"pool-1-thread-22" prio=5 tid=101b4b000 nid=0x127122000 waiting on condition [127121000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <6c340cee0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:680) 
    Locked ownable synchronizers: 
    - None 

现在的问题是:什么是这些线程在等待什么? 我怀疑类似乎产生这些线程,但我不知道究竟是什么使这些线程卡住。

有没有什么我可以做的,以找到原因,除了撕裂类逐行逐行并保持监视线程行为?

+1

恩,他们阻塞了队列。具体来说,当一个队列为空时,LinkedBlockingQueue.take()会无限期地阻塞。 –

+1

这是什么意思?什么队列和'()()'做的方法是什么? – Timo

+1

呃,这是你的代码......我们不是通灵。只要告诉你线程转储告诉你什么。 –

回答

19

在tomcat上,他们通常会请求工作线程等待某人连接。 没什么好担心的。他们已准备好处理那些一次连接到服务器的100个用户。

+0

那不可能。我可以明确地点击我的应用程序中产生这些线程的按钮。一旦点击,这些线程就会出现。一段时间后,这些线程消耗了太多的内存,导致服务器崩溃。 – Timo

+0

如果一个线程被阻塞(例如,在一个队列中等待),它们不能消耗更多的内存 - 它们没有运行,因此不能请求任何内存。如果有的话,他们的堆栈可能会在等待一段时间后分页,因此实际上减少了真正的RAM使用。 –

+5

我会对此表示同意@ptyx。推测在应用程序中单击按钮会向Tomcat服务器发送请求。我的猜测是,你的配置错误,告诉Tomcat能够处理大量的请求,因为你想成为企业级用户。 Tomcat不断在其ThreadPoolExecutor中创建一个新的'Thread',因为它还没有达到'corePoolSize'。最终崩溃你的服务器,因为你已经配置了大量的线程,但不允许有足够的内存来分配这些线程所需的所有堆栈空间。但这只是我的猜测。 –

6

这些线程是ThreadPool的一部分。更详细的说java.util.concurrent.ThreadPoolExecutor。线程正在等待Runnable/Callable被提交给池。例如

ExecutorService e = Executors.newFixedThreadPool(10); 

将创建10个线程,将坐在一个等待状态,直到

e.submit(new Runnable(){ 
    public void run(){ ...} 
}); 

然后一个线程将被通知并调用该Runnable。他们正在使用什么,我无法分辨。你必须找出启动线程池的内容。也许它的处理客户端请求应用程序服务器。

+0

不要这样想。这些线程不固定。它们是在用户与应用程序交互时动态创建的。经过长时间的使用,其中有数百个,而不仅仅是10个。 – Timo

+0

我想你必须找出用户交互后会发生什么。任何人都可以像我在示例中看到的那样创建这些线程。如果您为我们提供更多的代码,我们可以提供帮助。 –