Java 旧的垃圾收集会被填满,并且不会';不干净,可能是因为索引

Java 旧的垃圾收集会被填满,并且不会';不干净,可能是因为索引,java,garbage-collection,jms,hibernate-search,infinispan,Java,Garbage Collection,Jms,Hibernate Search,Infinispan,最近,我尝试使用Hibernate搜索索引,我正在努力为生产环境找到一个稳定的解决方案。在我使用HibernateOGM PersistenceContext进行索引时,这个例子出现在wildfly 10中。这会自动将数据添加到索引(Infinispan文件缓存存储) 问题是,我有一个MDB在使用来自JMS队列的数据,我需要在调用此函数时(onMessage,一个队列条目包含大约100万个实体-大请求)来持久化大约100万个实体,并通过无状态EJB将它们发布到另一个AMQP队列 在持久化和发布的

最近,我尝试使用Hibernate搜索索引,我正在努力为生产环境找到一个稳定的解决方案。在我使用HibernateOGM PersistenceContext进行索引时,这个例子出现在wildfly 10中。这会自动将数据添加到索引(Infinispan文件缓存存储)

问题是,我有一个MDB在使用来自JMS队列的数据,我需要在调用此函数时(onMessage,一个队列条目包含大约100万个实体-大请求)来持久化大约100万个实体,并通过无状态EJB将它们发布到另一个AMQP队列

在持久化和发布的过程中,我注意到在一段特定的时间后,主要gc无法发生,并且在旧gen满了之后,eden空间也变得非常有限,并且持久化和发布消息的速率大大降低

我的想法是,onMessage函数需要一个事务,在它完成之前,它会将所有数据保存在内存或其他东西(索引或持久化数据)中,并且不能仅仅为了能够回滚而清除旧的gen

我提供了一些监控图片。您可以很容易地看到,在两个内存空间(old gen和eden)都已满并试图清空之后,向另一个队列发布消息的速度会急剧下降(就像我从jms请求的列表中逐个创建实体一样,我将它们持久化,并在for循环中将它们发布到rabbitmq队列)。如果是这样的话,有没有办法让infinispan的索引始终在磁盘上?已经尝试了驱逐时的最小值、小块大小等,但效果不好。我也尝试过改变GC算法,但最终总是处于相同的情况。也许是另一个infinispan持久文件存储实现?我现在使用单文件缓存存储,以前使用软索引缓存存储。有什么建议和想法吗

谢谢

Hibernate搜索5.6.1、Infinispan 8.2.4、Hibernate OGM 5.1、Wildfly 10


最新版本的Infinispan(9.2)能够“堆外”存储数据,因此简单的回答是肯定的,这是可能的。但是,在选择这一点之前,先考虑一下大局,而不是所有从堆堆存储中得到的好处,因为这取决于很多因素。 Infinispan的定义是缓冲内存中最热的数据,默认情况下是“在堆上”,因为这将有助于您的整体性能,当它只是Java对象时,您可以跳过(反)序列化开销;您需要调整堆大小以适应您正在计划的负载,但它不能自动做到这一点。最简单的策略是,在启用非常大的堆大小时,在负载下使用类似的工具观察它,然后将其缩减到适合负载的合理大小


因此,在怀疑泄漏或无限增长之前,首先尝试验证堆是否太小,无法满足峰值操作要求。如果确实存在泄漏,您可能首先要尝试升级,因为这些版本非常旧-许多问题已经解决。

在这种情况下,最好是获得堆转储(例如
jmap-dump:format=b,file=
)然后使用EclipseMat之类的工具进行分析,看看发生了什么。我试着先升级第一个版本,现在我要检查一下。到目前为止,我只使用了visualvm和visualgc的可视化。从未听说过eclipse MAT。谢谢!我真的很想升级所有的模块,但我已经花了很多时间处理版本错误,以使其工作。我今天再次使用了orm和engine的功能包,但我需要ogm这一事实也可能是问题所在。我仍然收到随机错误,如:java.lang.NoClassDefFoundError:未能链接org/hibernate/search/jsr352/logging/impl/Log(服务模块加载器中的模块\“deployment.test.war:main\”):org/hibernate/search/util/logging/impl/BaseHibernateSearchLogger“}。谢谢你给我9.2的提示。另外,您的策略也很有效,今天也遵循它,但在这种情况下,我需要一个大ram来保证峰值需求的安全。如果系统能够在onMessage调用过程中暂停一段时间,清除旧的gen空间,并继续发布,而不是试图在很短的时间内清理一点,直到再次满为止,那就更好了。谢谢你,桑恩。