【问题标题】:Old Garbage Collection gets filled and doesn't clean, probably because of Indexing旧垃圾收集被填满并且无法清理,可能是因为索引
【发布时间】: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

VisualGC from visualVM

VisualVM

RabbitMQ

JMS Threads

Hibernate Search Sync Thread

【问题讨论】:

  • 在这种情况下最好的办法是获取堆转储(例如jmap -dump:format=b,file=<file_name> <pid>),然后使用 Eclipse MAT 等工具来分析并查看发生了什么。
  • 我尝试先升级第一个版本,现在我要检查一下。到目前为止,我只使用了 visualvm 和 visualgc 的可视化。没听说过eclipse MAT。非常感谢!

标签: java garbage-collection jms hibernate-search infinispan


【解决方案1】:

最新版本的 Infinispan (9.2) 能够“堆外”存储数据,所以简短的回答是可以。但在选择这样做之前请考虑大局,并非所有场景都能从堆外存储中受益,因为这取决于许多因素。

根据定义,Infinispan 旨在缓冲内存中最热的数据,默认情况下“在堆上”,因为当它只是 Java 对象时,这将有助于您的整体性能,因为您可以跳过(反)序列化开销;您需要调整堆大小以适应您计划的负载,它不能自动执行此操作。最简单的策略是在启用非常大的堆大小时使用类似的工具在负载下观察它,然后将其修剪到您知道适合您的负载的合理大小。

因此,在怀疑存在泄漏或无限增长之前,请先尝试验证您的堆是否太小,无法满足其峰值操作要求。如果确实存在实际泄漏,您可能首先要尝试升级,因为这些版本已经很旧了——很多问题已经得到修复。

【讨论】:

  • 我真的很想升级所有模块,但我已经花了很多时间处理版本错误以使其正常工作。我今天再次使用了 orm 和引擎的功能包,但我需要 ogm 的事实也可能是问题所在。我仍然收到随机错误,例如 Caused by: java.lang.NoClassDefFoundError: Failed to link org/hibernate/search/jsr352/logging/impl/Log (Module \"deployment.test.war:main\" from Service Module Loader) : org/hibernate/search/util/logging/impl/BaseHibernateSearchLogger"}.
  • 感谢您提供有关 9.2 的提示。您的策略也很有效,今天也遵循了它,但在这种情况下,我需要一个大公羊才能对峰值需求感到安全。如果系统可以在 onMessage 调用期间暂停并清理旧的 gen 空间并继续发布,而不是试图找到小的时间范围来清理一点直到再次满,那会更好。谢谢你,珊妮。
猜你喜欢
  • 2020-05-08
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多