Java ApacheTomcat请求线程

Java ApacheTomcat请求线程,java,multithreading,tomcat,Java,Multithreading,Tomcat,我们有一个应用程序,它泄漏了一点内存,这是一个轻描淡写的说法 我正在使用jvisualvm尝试查找导致问题的原因 我看到从以下名称开始的线程数量增加了很多:http-8080-示例:http:8080-42 我的第一个猜测是,这些线程中的每一个都是来自客户机的请求命中,因为每个客户机请求都在其自己的线程中处理 我的问题是这些线程已经运行了很长一段时间(到目前为止为10分钟) 我的问题是: 我的假设正确吗? 如果是这样,为什么线程会运行这么长时间?当然,它不会仍然忙于处理客户端请求吗?一般来说,应

我们有一个应用程序,它泄漏了一点内存,这是一个轻描淡写的说法

我正在使用
jvisualvm
尝试查找导致问题的原因

我看到从以下名称开始的线程数量增加了很多:http-8080-示例:http:8080-42

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

我的问题是这些线程已经运行了很长一段时间(到目前为止为10分钟)

我的问题是:

我的假设正确吗?
如果是这样,为什么线程会运行这么长时间?当然,它不会仍然忙于处理客户端请求吗?

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

线程创建开销相当昂贵,因此处理许多请求可以从共享线程中获得很大的好处。为了回答您的问题,服务器创建的调度线程(假设没有发生严重的运行时错误)将在服务器的生命周期内有效

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


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

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属性控制


JVM如何声明线程正在等待或锁定资源等?

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


尽管很明显,只是为了记录,超时的等待线程将超时,等待线程将等待
notify()
notifyAll()

这些线程是否可能是会话线程?所有这些线程都处于等待状态:“http-8080-24”-线程t@70java.lang.Thread.State:WAITING at java.lang.Object.wait(本机方法)-WAITING on(org.apache.tomcat.util.net.JIoEndpoint$Worker)at java.lang.Object.wait(Object.java:485)在org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:414)在org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:440)在java.lang.Thread.run(Thread.java:619)上锁定了可拥有的同步器:-是的,它们只是在等待更多的连接-这是完美的预期(也是理想的行为)。:)