2011-04-11 41 views
5

我们有一个应用程序泄漏了一点内存,有点轻描淡写。Apache Tomcat申请主题

我使用jvisualvm,试图找到是什么原因造成的问题。

我看到的线程数成长了不少上启动名为线程:HTTP-8080-例如:http:8080-42

我的第一个猜测是,每一个这些线程的是一个请求命中来自客户端,因为每个客户端请求都在其自己的线程中处理。

我的我的问题是,这些线程已运行的时间(迄今10分钟)长时间。

我的问题是这样的:

是我的假设是正确的? 如果是这样,为什么线程运行这么长时间?当然,它仍然无法满足客户的要求?

+0

这些线程可能是会话线程吗? – Koekiebox 2011-04-11 14:25:32

回答

6

的Tomcat总是有许多等待HTTP线程,例如,如果我们看一下默认连接器设置:

<Connector port="80" maxHttpHeaderSize="8192" 
       maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
       enableLookups="false" redirectPort="8443" acceptCount="100" 
       connectionTimeout="20000" disableUploadTimeout="true" /> 

我们可以看到,至少应该有至少25个线程住,而是在等待连接(达到maxThreads限制)。这由min和maxSpareThreads属性控制。

什么JVisual VM状态的线程正在进行等待或锁定在资源等等等等?

+0

所有这些线程都处于WAITING状态:“http-8080-24” - 线程t @ 70 java.lang.Thread.State:WAITING \t at java.lang.Object.wait(Native Method) \t - 等待<96c084>(一org.apache.tomcat.util.net.JIoEndpoint $工人) \t在java.lang.Object.wait(Object.java:485) \t在org.apache.tomcat.util.net.JIoEndpoint $ Worker.await(JIoEndpoint.java:414) \t at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:440) \t at java.lang.Thread.run(Thread.java :619) 锁定的拥有同步器: \t - None – Koekiebox 2011-04-11 14:40:37

+0

是的,他们只是在等待更多的连接 - 完美的预期(和理想的行为)。 :) – Mikaveli 2011-04-11 14:42:21

1

一般来说,应用服务器会预先创建多个线程。应用程序服务器不仅会创建它们,还会保持线程。这被称为线程池。服务器将接收一个请求并将其分派给一个线程,并且当该请求完成时,服务器将向该线程分派一个新的请求。

线程创建开销相当昂贵,因此处理许多请求会从共享线程中受益匪浅。要回答你的问题,调度由服务器创建的线程(假设没有发生严重的运行时错误)将在服务器的整个生命周期内运行。

至于你所看到的,如果你看到正在启动许多许多线程,那么应用程序的其他部分可以分叉线程这是一个完全独立的问题。

其重要的是知道你的tomcat服务器不应该为每个请求创建新线程(再次一般来说)应该重用线程。

2

检查tomcat连接器配置。请注意0​​和其他线程池的配置。一个常见的错误是仅仅增加maxThreads而实际上没有“调整”。如果你配置一个不必要的大池,它将导致大量的空闲线程。这不会有好处。

尽管很明显,只是为了记录,TIMED_WAITING线程将超时,并且WAITING线程只会为notify()notifyAll()放置。