我是Hibernate Search的新手,并尝试将其与我的应用程序集成。 面临内存泄漏问题(线程进入等待/停放状态)。
Hibernate Search配置(非常小)是注释驱动的。使用:
@Indexed(index = "<index_name>")
@IndexedEmbedded
AND
@Field(name = "title", store = Store.YES, analyzer = @Analyzer(definition = "standardAnalyzer")
Hibernate搜索属性:
<property name="hibernate.search.default.indexBase" value="../lucene/indexes" />
<property name="hibernate.search.default.directory_provider" value="filesystem" />
<property name="hibernate.search.default.exclusive_index_use"
value="false" />
使用Tomcat 8部署应用程序。
我的主要问题是
VisualVm清楚地表明Hibernate搜索为每个索引创建了一个同步消费者线程。它对我对我的服务器进行的每次调用都这样做(在我的情况下,每次调用时会生成2个新线程并处于驻留状态)。最终线程数量增加,直到我的服务器无响应。
在服务器关闭时,我收到错误:
09-Aug-2017 17:15:28.151警告[localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[procurewise]似乎已经启动了一个名为[Hibernate Search sync consumer]的线程索引类别的线程]但未能阻止它。这很可能造成内存泄漏。堆栈跟踪线程: sun.misc.Unsafe.park(原生方法) java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:338) org.hibernate.search.backend.impl.lucene.SyncWorkProcessor.parkCurrentThread(SyncWorkProcessor.java:175) org.hibernate.search.backend.impl.lucene.SyncWorkProcessor.access $ 300(SyncWorkProcessor.java:35) org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.run(SyncWorkProcessor.java:147) java.lang.Thread.run(Thread.java:745)
我正在使用Spring,Hibernate,JPA,AOP和JAX-RS,Jersey。
环境详情:
Hibernate版本5.2.10.Final
Hibernate Search版本5.7.0.Final
Spring version 4.3.6.RELEASE
JPA 2.1
JAVA 8
Jersey 1.8
答案 0 :(得分:0)
当Hibernate Search关闭时,该线程应自动停止,这在Hibernate ORM关闭时会自动发生。
我发现这个警告有两个原因:Tomcat在Hibernate ORM仍然关闭的情况下检查了线程,或者你根本没有停止Hibernate ORM。
我建议检查你的关机过程,看看Hibernate ORM是否正确关闭(通常你使用org.hibernate.SessionFactory.close()
,但我希望Spring能够自己处理),如果是的话,看看它是否同步关闭(这样你的Tomcat只会在完成所有关闭后执行检查)。