Java 什么启动连接驱逐器线程?可以做什么来避免这些线程累积?

Java 什么启动连接驱逐器线程?可以做什么来避免这些线程累积?,java,solr,memory-leaks,Java,Solr,Memory Leaks,我的Java程序在linux下运行,并使用Solr7.4索引多个目录(通过samba从不同的windows服务器装载)。它一个接一个地更新不同的索引(每个索引目录一个索引),并无限循环返回 在我的开发机器上运行时,我将VisualVM连接到它,并看到线程数量不断增加: 据我所知,这与内存泄漏有关(我也在努力寻找) VisualVM显示连接驱逐器线程不断累积,并且都处于休眠状态: 但说明休眠线程不会向系统添加任何负载(因为它们是空闲的),因此不会导致内存泄漏 因此,我的问题是: 是否应该将此行

我的Java程序在linux下运行,并使用Solr7.4索引多个目录(通过samba从不同的windows服务器装载)。它一个接一个地更新不同的索引(每个索引目录一个索引),并无限循环返回

在我的开发机器上运行时,我将VisualVM连接到它,并看到线程数量不断增加:

据我所知,这与内存泄漏有关(我也在努力寻找)

VisualVM显示连接驱逐器线程不断累积,并且都处于休眠状态:

但说明休眠线程不会向系统添加任何负载(因为它们是空闲的),因此不会导致内存泄漏

因此,我的问题是:

是否应该将此行为视为一个问题,如果是,那么我应该在源代码中看到什么,因为我不使用HTTP连接(我读的使用连接Evcor),因为所有目录都是由OS?


感谢您的帮助;-)

简单回答我自己的问题:

是的,有这么多的连接驱逐线程是生产上的一个问题,因为我认为这会在一段时间后导致OOM

对我来说,出现这个问题是因为我创建了太多的
SolrClient
s,而只需要一个(所有核心都在同一台服务器上)

所以不是

solrClient = new HttpSolrClient.Builder(
                getSolrHomePath() + "/" + getCoreName()
        ).
                build();
其中
getSolrHomePath()
返回指向
solr-X.Y.Z/server/solr
的路径

我现在用

commonSolrClient = new HttpSolrClient.Builder(
                getSolrHomePath() 
        ).
                build();

当我需要
查询
一个core时,我会将core名称作为第一个参数传递给。添加/删除方法也一样

在我的应用程序中,是Apache HttpClient启动所有这些线程。似乎每个连接都会启动一个新的所谓的exector线程。其目的是监测f.ex的陈旧连接。如果服务器关闭了套接字。我的应用程序有一个最多50个连接的连接池,但我仍然看到1200个“连接驱逐器”线程。如果我理解了逐出器线程的用途,那么它最多应该是50个,或者空闲线程确实会为堆栈和线程本地存储消耗内存。从长远来看,越来越多的线程会消耗所有分配的内存。如何创建线程以及如何终止线程?你能发布一个睡眠线程的堆栈跟踪吗?他们还在等什么?@PakUula@perja谢谢你的意见。事实上,我在创造一个新的世界。现在,我在整个应用程序中重复使用相同的
SolrClient
,正如我引用的第二篇文章中所建议的那样:
您应该为每个服务器节点保留一个SolrClient,并指示每个请求访问哪个核心。一个客户端对象可以访问节点上的每个核心。您必须从URL中删除核心名称。现在线程数保持在20左右。