java线程挂起,导致线程池资源耗尽,服务器响应缓慢

发布于 2021-11-27 13:44:38 字数 2416 浏览 907 评论 14

Thread Dump如下:

"http-8080-147" daemon prio=10 tid=0x00007fb970216000 nid=0x3792 waiting on condition [0x00007fb7ecfcd000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x000000073e4e0000> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
        at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:133)
        at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:282)
        at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:177)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:170)
        at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:102)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:244)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:231)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:173)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
        at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
        at com.mailu.re.commons.http.NewHttpClientHelper.doGet(NewHttpClientHelper.java:80)



其本质是Servlet调用HttpClient对Solr进行访问。

Solr访问网络没有问题,JDK1.7,Linux ulimit 8K

CPU,内存正常。

有6台服务器部署了一样的代码,有一台不会阻塞,配置都是一样的。


请各位大大帮忙指点




如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

浮生未歇 2021-11-30 17:58:43

你先判断下是solr服务器不允许建立连接,还是部署servlet的服务器无法建立更多了解。比如打开句柄受限,连接过多未释放什么的。。。把确定没有问题的地方排除掉,逐步缩小包围圈。。。

倾城泪 2021-11-30 17:58:42

引用来自“zfc827”的评论

你理解的异步是客户端的哦,我说的是服务端的异步,HTTP1.1的重要改进就是允许浏览器和服务器保持一个长连接,而不是请求完就马上返回,这就让Servlet3.0规范中新加入了一个异步上下文接口 AsyncContext

通过 request#startAsync() 方法开启上下文,并注册相关监听,这样能做到即时释放 Servlet 线程,对于改善因耗时任务引发的 Servet 容器线程池被大量阻塞很有帮助。下面是一个例子,你可以参考一下。

旧伤慢歌 2021-11-30 17:58:41

修改连接池的参数吧。

http://jinnianshilongnian.iteye.com/blog/2089792

另外为什么要直接用HttpClient来调用solr,而不选择 solr4j呢?

一人独醉 2021-11-30 17:58:41

历史遗留原因,你懂的。。。

不再见 2021-11-30 17:58:41

http://www.oschina.net/p/unirest

冷默言语 2021-11-30 17:58:15

把整个dump发出来比较好分析。

别再吹冷风 2021-11-30 17:58:01

是Tomcat的满了,最多我看到有500个,阻塞在HttpClient那里。。

猫烠⑼条掵仅有一顆心 2021-11-30 17:57:05

回复
如果你用的是Servlet 3.0,应该考虑用异步请求处理耗时长的工作,释放tomcat线程。如果不是,就应当自己实现异步。

天涯离梦残月幽梦 2021-11-30 17:53:04

@zfc827 系统要求是实时响应。。。异步适用于图片获取,Email发送等。。

霞映澄塘 2021-11-30 17:32:59

这个线程池是 Servlet 容器的线程池还是 HttpClient 的?

心舞飞扬 2021-11-30 16:13:45

引用来自“杨三更”的评论

贴上来的东西还是少。。。,建议增加个超时失败 应该会有改善

冬天旳寂寞 2021-11-30 10:58:51

贴上来的东西还是少。。。,建议增加个超时失败 应该会有改善

为你鎻心 2021-11-30 04:42:24

自己给自己顶一个。。求高手啊。。搞了3天都搞不出结果来。。。

无法言说的痛 2021-11-28 02:24:16

你理解的异步是客户端的哦,我说的是服务端的异步,HTTP1.1的重要改进就是允许浏览器和服务器保持一个长连接,而不是请求完就马上返回,这就让Servlet3.0规范中新加入了一个异步上下文接口 AsyncContext

通过 request#startAsync() 方法开启上下文,并注册相关监听,这样能做到即时释放 Servlet 线程,对于改善因耗时任务引发的 Servet 容器线程池被大量阻塞很有帮助。下面是一个例子,你可以参考一下。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文