A question to Team Lucee: Are Lucee’s custom class loaders single-threaded or multithreaded?
I ask because our logs show many situations where a lock is associated with Lucee’s custom class loaders. Beyond a certain request load, the application’s performance falls sharply. Requests that should normally take several seconds begin to last 3 minutes.
The result is that our application, good for thousands of users per day, practically comes to a standstill. Related ticket.
Here is an excerpt from one of the typical stacktraces we’re getting from FusionReactor’s profiler:
…
dvnt.stdrdr.vo.basicuservo_cfc$cf.udfCall(/nl/dvnt/stdrdr/vo/BasicUserVO.cfc)
lucee.runtime.functions.decision.IsInstanceOf.call(IsInstanceOf.java)
lucee.runtime.reflection.Reflector.isInstaneOf(Reflector.java) (hide)
lucee.commons.lang.ClassUtil.loadClass(ClassUtil.java)
lucee.commons.lang.ClassUtil.loadClass(ClassUtil.java)
lucee.commons.lang.ClassUtil._loadClass(ClassUtil.java)
lucee.commons.lang.ClassUtil.__loadClass(ClassUtil.java)
lucee.commons.lang.ClassUtil$ClassLoaderBasedClassLoading.loadClass(ClassUtil.java)
java.lang.ClassLoader.loadClass(Unknown Source)
java.lang.ClassLoader.loadClass(Unknown Source)
Waiting on lock <0x54d4dccc> (a java.lang.Object)
…
The line of code at /nl/dvnt/stdrdr/vo/BasicUserVO.cfc is:
/*** /nl/dvnt/stdrdr/vo/BasicUserVO.cfc ***/
if ( isInstanceOf(arguments.data, "nl.dvnt.stdmtr.orm.UsersRO") ) {
See attached for more on the FusionReactor Profiler stacktrace.
The lock makes me wonder whether every custom class loader used by Lucee follows the “Recommendations for Multithreaded Custom Class Loaders”
FusionReactor_Profiler_stacktrace_longlasting_request.txt (16.7 KB)