是什么启动了连接逐出线程?可以采取哪些措施来避免这些线程累积?

Hel*_*rld 6 java solr memory-leaks

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

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

VisualVM 显示线程数量不断增加

从这个帖子我明白了了解到它与内存泄漏有关(我也在试图找到)。

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

休眠连接逐出线程累积

这个帖子告诉我们,睡眠线程不会给系统增加任何负载(因为它们是空闲的),因此它们不会导致内存泄漏。

所以我的问题是:

我是否应该认为这种行为是一个问题,如果是这样,我应该在源代码中查看哪里,因为我不使用http连接(我读到使用连接驱逐器),因为所有目录都是由操作系统本地安装的?

任何帮助表示赞赏;-)

Hel*_*rld 1

简要回答我自己的问题:

是的,拥有如此多的连接驱逐线程在生产中是一个问题,因为我认为它会在一段时间后导致 OOM。

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

所以而不是

solrClient = new HttpSolrClient.Builder(
                getSolrHomePath() + "/" + getCoreName()
        ).
                build();
Run Code Online (Sandbox Code Playgroud)

wheregetSolrHomePath()返回 的路径solr-X.Y.Z/server/solr

我现在用

commonSolrClient = new HttpSolrClient.Builder(
                getSolrHomePath() 
        ).
                build();
Run Code Online (Sandbox Code Playgroud)

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