Hi,
so I dug into the hotspot code for JDK 131, and I found the problem. I am too tired
now to think for a solution, this is for you brave guys :)
The problems arises from a 20 lines of code in
src/share/vm/memory/systemDictionary.cpp (attached), method
resolve_instance_class_or_null(...).
The loading mechanism of the JVM is done in 2 steps:
1- look in a dictionary, if not found, put there a placeholder, then
2- load the class, calling loadClassInternal().
Thread A comes in asking for class "cls1" with classloader cl1, the class has never
been loaded, put a placeholder in the dictionary, and call loadClassInternal.
Thread B comes in asking for class "cls1" with classloader cl1, there is already a
placeholder, throw CCE.
The key is to ask for the same class with the same classloader.
I think this may happen with the UnifiedClassLoader scheme in several occasions, a
simple example being:
class Base {}
class Derived1 extends Base {}
class Derived2 extends Base {}
If Base is loaded by classloader1, and we have 2 threads trying to load one Derived1
and one Derived2 (and both need Base), we end up with 2 thread using the same
classloader to load the same class, and the JVM code throws CCE.
I wrote a simple testcase (attached), but it does not use JBoss classloaders, however
should be trivial to code it against JBoss codebase. If someone can take care of it...
thanks :P
As I said I did not think enough to find a solution, but at least we all know where to
start.
Cheers
Simon
PS: it seems attachments are not allowed ?
_______________________________________________________________
Don't miss the 2002 Sprint PCS Application Developer's Conference
August 25-28 in Las Vegas -- http://devcon.sprintpcs.com/adp/index.cfm
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development