问题描述
我的Java程序在linux下运行,并使用SOLR 7.4为几个目录(通过从不同Windows服务器通过samba安装的目录)建立索引。它会依次更新不同的索引(每个索引目录一个索引),然后无限循环。
在我的开发机上运行时,我将VisualVM附加到它上,并发现线程数量一直在增加:
我从this post那里了解到,这与内存泄漏有关(我也在尝试查找)。
VisualVM显示Connection evictor线程不断累积,并且都处于睡眠状态:
但是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。添加/删除方法也一样!