Java 休眠搜索+;Lucene垃圾收集问题

Java 休眠搜索+;Lucene垃圾收集问题,java,hibernate,hibernate-search,Java,Hibernate,Hibernate Search,我们有一个运行HibernateSearch5.10.7.Final的SpringBoot应用程序,带有Lucene后端,每天同一时间CPU使用率都很高 线程转储显示,消耗CPU的线程对应于JVM的垃圾收集活动: "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fdef801f800 nid=0x173b runnable "GC task thread#1 (ParallelGC)" os_pri

我们有一个运行HibernateSearch5.10.7.Final的SpringBoot应用程序,带有Lucene后端,每天同一时间CPU使用率都很高

线程转储显示,消耗CPU的线程对应于JVM的垃圾收集活动:

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fdef801f800 nid=0x173b runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007fdef8021800 nid=0x173c runnable
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007fdef8023800 nid=0x173d runnable
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007fdef8025000 nid=0x173e runnable
堆转储将
periodiCreshingReaderProvider的两个实例显示为最大的对象

还有3763个
org.apache.lucene.index.StandardDirectoryReader
实例

我对HibernateSearch或Lucene不够熟悉,无法确定这是否是典型的情况,我们只是需要更大的堆大小,或者其他一些问题

当前最大堆大小为12GB(-Xmx)。ApacheLucene索引仅包含约8GB的磁盘空间

休眠搜索设置

hibernate.search.default.directory_provider = filesystem
hibernate.search.default.indexBase = /var/lucene/indexes
hibernate.search.default.reader.strategy = async
hibernate.search.default.reader.async_refresh_period_ms = 8000


您显然在使用,而引用所有打开的阅读器的地图显然变得非常非常大

不,那不正常

你提到了CPU峰值每天都在同一时间发生。您将刷新周期设置为什么?例如,配置属性hibernate.search.[default |].reader.async_refresh_period_ms的值是多少?如果这是一个非常巨大的价值接近24小时,这可以解释你的问题

索引阅读器通常不会被保存这么长时间,所以我想随着时间的推移,它们可能会变得非常庞大。如果您处于这种情况,请尝试将刷新周期缩短到更合理的时间,例如1分钟或5分钟:您可能会更频繁地出现CPU峰值,但峰值要小得多,并且您将使用更少的内存

或者,某个地方可能有读卡器泄漏

我想这可能是Hibernate搜索中的一个漏洞,但是相关代码已经使用多年了,我们还没有看到一个关于这种漏洞的报告,所以我觉得这是可疑的


您是否有可能在应用程序中显式访问索引读取器?通过如果是这样,请检查您是否正确关闭了读卡器。如果不这样做,则实际上是在泄漏索引读取器。

使用Hibernate搜索设置更新了我的帖子。刷新周期为8毫秒,根据文档,这似乎是标准的。应用程序可能直接访问索引读取器。我会调查的。