什么启动了连接退出线程,可以做些什么来避免这些线程积聚?

问题描述

我的Java程序在linux下运行,并使用SOLR 7.4为几个目录(通过从不同Windows服务器通过samba安装的目录)建立索引。它会依次更新不同的索引(每个索引目录一个索引),然后无限循环。

在我的开发机上运行时,我将VisualVM附加到它上,并发现线程数量一直在增加

VisualVM shows increasing number of threads

我从this post那里了解到,这与内存泄漏有关(我也在尝试查找)。

VisualVM显示Connection evictor线程不断累积,并且都处于睡眠状态:

Sleepling connection evictor threads accumulate

但是this post告诉我们休眠线程不会给系统增加任何负载(因为它们处于空闲状态),因此它们不会导致内存泄漏。

所以我的问题是:

我应该认为此行为是一个问题,如果是这样的话,由于所有目录均由OS本地挂载,因此我不使用http连接(我读为使用连接驱逐器),因此应在源代码中的何处查看?

任何帮助表示赞赏;-)

解决方法

要简要回答我自己的问题:

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

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

所以不是

solrClient = new HttpSolrClient.Builder(
                getSolrHomePath() + "/" + getCoreName()
        ).
                build();

其中getSolrHomePath()返回到solr-X.Y.Z/server/solr的路径。

我现在使用

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

,当我需要query核心时,我将核心名称作为第一个参数传递给query function。添加/删除方法也一样!