【发布时间】:2018-08-17 22:40:02
【问题描述】:
最近,我尝试使用 Hibernate Search 索引,我正在努力为生产环境找到一个稳定的解决方案。该案例在 Wildfly 10 中,因为我正在使用 HibernateOGM PersistenceContext 进行索引。这会自动将数据添加到索引(Infinispan 文件缓存存储)。
问题是我有一个 MDB 使用来自 JMS 队列的数据,我需要调用这个函数(onMessage,一个队列条目包含大约 100 万个实体 - 大请求)来持久化大约 100 万个实体并发布它们通过无状态 EJB 到另一个 AMQP 队列。
在持久化和发布时,我注意到在特定时间后,major gc 不会发生,并且在 old gen 被填满后,伊甸园空间也变大,并且持久化和发布消息的速率大大降低。
我的想法是 onMessage 函数需要一个事务,并且在它完成之前它将所有数据保留在内存中或其他东西(索引或持久数据)中,并且不能只清理旧的 gen 以便能够回滚。
我提供一些监控图片。您可以很容易地看到,在两个内存空间(旧 gen 和 eden)都已满并试图清空之后,将消息发布到另一个队列的速度会急剧下降(就像我从作为来自 jms 的请求的列表,我将它们持久化并在 for 循环中将它们发布到 rabbitmq 队列)。如果是这种情况,有什么方法可以使用 infinispan 将索引始终保存在磁盘上?已经在驱逐、小块大小等方面尝试了最小值。效果不佳。还尝试更改 GC 算法,但我最终总是处于相同的情况。也许另一个 infinispan 持久文件存储实现?我现在使用单文件缓存存储,之前使用软索引缓存存储。有什么建议吗?
谢谢
休眠搜索 5.6.1、Infinispan 8.2.4、休眠 OGM 5.1、Wildfly 10
【问题讨论】:
-
在这种情况下最好的办法是获取堆转储(例如
jmap -dump:format=b,file=<file_name> <pid>),然后使用 Eclipse MAT 等工具来分析并查看发生了什么。 -
我尝试先升级第一个版本,现在我要检查一下。到目前为止,我只使用了 visualvm 和 visualgc 的可视化。没听说过eclipse MAT。非常感谢!
标签: java garbage-collection jms hibernate-search infinispan