在解决线程泄漏问题方面需要帮助

时间:2019-06-18 03:51:31

标签: multithreading profiling threadpool

因此,我们创建了一个新的Netty4服务器,并对其产生负载。主机线程的数量随着服务器的TPS的增加而增长。此外,一旦负载测试结束,主机线程数就不会减少(建议存在某种线程泄漏)。

我使用jstack进行了hprof转储,并将其连接到JProfiler。在线程视图中,线程的共享部分为格式。 (请注意,这是负载测试之后的一个线程转储小时,并且是其中的一个实例,其中有数千个陷入其中。)

线程转储在26013:42.622.361

Thread group "main":

Thread "I/O dispatcher 18120":
at sun.nio.ch.EPollArrayWrapper.epollWait(long, int, long, int)
at sun.nio.ch.EPollArrayWrapper.poll(long) (line: 269)
at sun.nio.ch.EPollSelectorImpl.doSelect(long) (line: 93)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(long) (line: 86)
at sun.nio.ch.SelectorImpl.select(long) (line: 97)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute() (line: 255)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(org.apache.http.nio.reactor.IOEventDispatch) (line: 104) at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run() (line: 588 at java.lang.Thread.run() (line: 748)

我不确定如何从这里进一步进行操作(例如,我不知道应该使用哪个执行程序服务IO调度程序)。

该问题是有关如何解决此类线程泄漏问题的一般指导。

1 个答案:

答案 0 :(得分:0)

因此,事实证明IO线程分派器是Apache HTTP客户端的一部分。

我们必须保留apache http客户端的缓存(作为更古怪的aws弹性搜索客户端,因为它们是根据请求凭据https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-configuration-samples.html设置的)。每当我们看到从缓存中从客户端获取的新请求时。

现在,我们的负载测试正在抛出许多具有不同凭据的请求。缓存的增长速度越来越快,超过了客户端过期的缓存速度。每个客户端用完越来越多的线程,直到我们用完它们。