gpt4 book ai didi

java - 应用程序(JBoss + Hibernate + Infinispan)性能在相同数据上下降

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:22 25 4
gpt4 key购买 nike

我们有以下 Web 应用程序堆栈:DB + Infinispan 5.1.2 + Hibernate 3.6.9 + JBoss AS 7.1 + Seam 2.2 + RichFaces 3.3(JSF 1.2)。

应用程序启动后,一页显示过去一段时间的历史数据 1-2 秒。在此渲染期间,Hibernate session (1 级)缓存包含大约 8000 个对象,并且在接下来的一周内,数据没有更改(根本没有更改),但此页面渲染的性能从 1 秒降低到 30-70 秒。

jVisualVM Sampler 讲述 Hibernate Session 对象中的 autoFlushIfRequired 方法所消耗的时间。在渲染过程中,我们大约调用了 25-30 次该函数。所有 Hibernate 查询都被缓存,所有数据库事务的生命周期都很短。线程数略有增加。我们有 12-50 个同时运行的应用程序客户端(浏览器)。我们没有内存泄漏并且有足够的内存(每 10-15 分钟启动一次 full gc)。 young GC时间不断增加。 Java 以以下参数开始:

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=0
-XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseLargePages -XX:LargePageSizeInBytes=4m
-XX:+UseTLAB"
-Xms3092m -Xmx3092m -XX:MaxPermSize=512m -XX:MaxNewSize=1g
-XX:NewSize=1g -XX:SurvivorRatio=128

在监控 Cent OS 期间,我们看到计数器“每秒上下文切换”(vmstat 输出)从 1000 - 1500 增加到 8000 - 10000。我们可能在 Heap/Hibernate/Infinispan 中存在访问同步问题吗?我们还应该检查哪些其他案例?怎么检查呢?

最佳答案

听起来 Hibernate 最终会遍历所有对象以查看它们是否脏了。当您启动应用程序时,它不必这样做,但它进展得越远,情况就越糟。

也许您可以尝试仅在需要时手动调用 flush() ?或者实现您自己的自定义检查,而不是让 Hibernate 自行确定需要刷新的内容。

您可以通过实现 the Interceptor interface 来做到这一点(如果您不想实现全部,请扩展EmptyInterceptor)并根据您的喜好实现findDirty 方法。这样你就可以告诉 Hibernate 不要理会未更改的对象。

关于java - 应用程序(JBoss + Hibernate + Infinispan)性能在相同数据上下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33431040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com