java - Synchronized Classloader calls from Hibernate -
we having performance issue in our project seems originate (at to the lowest degree in parts) way hibernate uses classloader. discovered in java thread dumps taken during high load tests on our internal environment. jvm dumped jvm of weblogic managed server runs application, , dumps taken while monitoring dashboard shows hogging threads , pending user requests.
example:
"[active] executethread: '126' queue: 'weblogic.kernel.default (self-tuning)'" daemon prio=10 tid=0x00007f2fe9486000 nid=0x663b waiting monitor entry [0x00007f2faeae6000] java.lang.thread.state: blocked (on object monitor) @ java.lang.classloader.loadclass(classloader.java:405) - waiting lock <0x000000078c0d76b0> (a weblogic.utils.classloaders.genericclassloader) @ java.lang.classloader.loadclass(classloader.java:358) @ weblogic.utils.classloaders.genericclassloader.loadclass(genericclassloader.java:178) @ org.hibernate.internal.util.reflecthelper.classforname(reflecthelper.java:187) @ org.hibernate.internal.util.reflecthelper.getconstantvalue(reflecthelper.java:278) @ org.hibernate.hql.internal.ast.querytranslatorimpl$javaconstantconverter.handledotstructure(querytranslatorimpl.java:592) @ org.hibernate.hql.internal.ast.querytranslatorimpl$javaconstantconverter.visit(querytranslatorimpl.java:587)
what can see in these thread dumps (using samurai/tda) there seem great many threads @ time waiting locks on classloader. classloader, provided wls, seems synchronized - explains locking/blocking thread pattern...
it seems hibernate uses classloader evaluate expressions in queries. i'm not sure classloader calls load new classes.
the problem number of calls classloader appear going on time... @ times observed much 30% of total number of threads (~30-40+ our of 130) waiting on getting classloader lock!
--> seems synchronization of wls classloader leads very high internal overhead when high number of threads trying service high user load (i.e. many hibernate queries).
is behavior normal or doing wrong?right synchronized classloader issue seems main reason limits throughput of our application, leading degrading performance under heavy load. problem not go away if scale cpu/memory or various wls specific pools (like ejb/jdbc connections/...) -- specific entire jvm run our app in.
i'd much appreciate input on topic.
p.s.
google seemed show not first ones encounter issue (e.g. this mailing list question or this oracle back upwards question), there no real solution/explanation problem.
the problem application programmers think class.forname()
, classloader.loadclass()
inexpensive operations new object()
be. , application servers thinks rare startup operation.
for hibernate using criteria or dynamic generated jpql can trigger lock contention http://dimovelev.blogspot.dk/2015/02/performance-pitfalls-hibernate-criteria.html
java hibernate weblogic classloader
No comments:
Post a Comment