来自 Hibernate 的同步类加载器调用

2023-12-23

我们的项目中存在一个性能问题,该问题似乎源于(至少部分)来自 Hibernate 使用类加载器的方式。这是在我们内部环境的高负载测试期间进行的 Java 线程转储中发现的。转储的 JVM 是运行应用程序的 Weblogic 托管服务器的 JVM,并且在监控仪表板显示占用线程和挂起的用户请求时进行转储。

Example:

"[ACTIVE] ExecuteThread: '126' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007f2fe9486000 nid=0x663b waiting for monitor entry [0x00007f2faeae6000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:405)
    - waiting to lock <0x000000078c0d76b0> (a weblogic.utils.classloaders.GenericClassLoader)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:178)
    at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:187)
    at org.hibernate.internal.util.ReflectHelper.getConstantValue(ReflectHelper.java:278)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl$JavaConstantConverter.handleDotStructure(QueryTranslatorImpl.java:592)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl$JavaConstantConverter.visit(QueryTranslatorImpl.java:587)

我们在这些线程转储(使用 Samurai/TDA)中可以看到,似乎任何时候都有大量线程等待类加载器上的锁。这个由 WLS 提供的类加载器似乎是同步的 - 这解释了锁定/阻塞线程模式......

Hibernate 似乎使用类加载器来计算查询中的表达式。所以我不确定类加载器调用实际上加载了任何新类。

问题是对类加载器的调用次数似乎一直在进行...有时我观察到线程总数的 30%(约 30-40+ 我们的 130 个)正在等待获取类加载器锁!

--> 看来WLS类加载器的同步导致了非常高的内部开销当大量线程尝试服务高用户负载时(即许多 Hibernate 查询)。

这种行为是正常的还是我们做错了什么?

现在,这个同步类加载器问题似乎是限制我们应用程序吞吐量的主要原因,导致重负载下性能下降。此外,如果我们扩展 CPU/内存或各种 WLS 特定池(如 EJB/JDBC 连接/...),问题也不会消失——因为它特定于我们运行应用程序的整个 JVM。

我非常感谢您对此主题的意见。


P.S.

谷歌似乎表明我们并不是第一个遇到这个问题的人(例如这个邮件列表问题 http://lists.jboss.org/pipermail/hibernate-dev/2008-December/003548.html or ),但这个问题没有真正的解决方案/解释。


问题是应用程序程序员认为Class.forName() and Classloader.loadClass()是廉价的操作,例如new Object()将会。并且应用服务器认为它们是罕见的启动操作。

对于 hibernate 使用条件或动态生成的 JPQL 可以触发此锁争用http://dimovelev.blogspot.dk/2015/02/performance-pitfalls-hibernate-criteria.html http://dimovelev.blogspot.dk/2015/02/performance-pitfalls-hibernate-criteria.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 Hibernate 的同步类加载器调用 的相关文章

随机推荐