RFR: 8038468: java/lang/instrument/ParallelTransformerLoader.sh fails with ClassCircularityError
Yumin Qi
yumin.qi at oracle.com
Fri Oct 24 23:08:55 UTC 2014
Serguei,
Thanks for your comments.
This test happens intermittently, but now it can repeat with 8/9.
Loading TestClass1 in main thread while loading TestClass2 in
TestThread in parallel. They both will call transform since
TestClass[1-3] are loaded via agent. When loading TestClass2, it will
call loading TestClass3 in TestThread.
Note in the main thread, for loop:
for (int i = 0; i < kNumIterations; i++)
{
// load some classes from multiple threads
(this thread and one other)
Thread testThread = new TestThread(2);
testThread.start();
loadClasses(1);
// log that it completed and reset for the next
iteration
testThread.join();
System.out.print(".");
ParallelTransformerLoaderAgent.generateNewClassLoader();
}
The loader got renewed after testThread.join(). So both threads are
using the exact same class loader. After create a new class loader, next
loop will use the loader. This is why quite often on the stack trace we
can see it resolves JarLoader$2.
I am not quite understand the test case either. Loading TestClass3
inside transform using the same classloader will cause call to
transform again and form a circle. Nonetheless, if we see TestClass2
already loaded, the loop will end but that still is a risk.
Thanks
Yumin
On 10/24/2014 1:20 PM, serguei.spitsyn at oracle.com wrote:
> Hi Yumin,
>
> Below is some analysis to make sure I understand the test scenario
> correctly.
>
> The ParallelTransformerLoaderApp.main() executes a 1000 iteration loop.
> At each iteration it does:
> - creates and starts a new TestThread
> - loads TestClass1 with the current class loader:
> ParallelTransformerLoaderAgent.getClassLoader()
> - changes the current class loader with new one:
> ParallelTransformerLoaderAgent.generateNewClassLoader()
>
> The TestThread loads the TestClass2 concurrently with the main thread.
>
> At the CFLH events, the ParallelTransformerLoaderAgent does the class
> retransformation.
> If the thread loading the class is not "main", it loads the class
> TestClass3
> with the current class loader
> ParallelTransformerLoaderAgent.getClassLoader().
>
> Sometimes, the TestClass2 and TestClass3 are loaded by the same class
> loader recursively.
> It happens if the class loader has not been changed between loading
> TestClass2 and TestClass3 classes.
>
> I'm not convinced yet the test is incorrect.
> And it is not clear why do we get a ClassCircularityError.
>
> Please, let me know if the above understanding is wrong.
> I also see the reply from David and share his concerns.
>
> It is not clear if this failure is a regression.
> Did we observe this issue before?
> If - NOT then when and why had this failure started to appear?
>
> Unfortunately, it is impossible to look at the test run history at the
> moment.
> The Aurora is at a maintenance.
>
> Thanks,
> Serguei
>
> On 10/13/14 3:58 PM, Yumin Qi wrote:
>> bug: https://bugs.openjdk.java.net/browse/JDK-8038468
>> webrev:*http://cr.openjdk.java.net/~minqi/8038468/webrev00/
>>
>> the bug marked as confidential so post the webrev internally.
>>
>> Problem: The test case tries to load a class from the same jar via
>> agent in the middle of loading another class from the jar via same
>> class loader in same thread. The call happens in transform which is a
>> rare case --- in middle of loading class, loading another class. The
>> result is a CircularityError. When first class is in loading, in vm
>> we put JarLoader$2 on place holder table, then we start the
>> defineClass, which calls transform, begins loading the second class
>> so go along the same routine for loading JarLoader$2 first, found it
>> already in placeholder table. A CircularityError is thrown.
>> Fix: The test case should not call loading class with same class
>> loader in same thread from same jar in 'transform' method. I modify
>> it loading with system class loader and we expect see
>> ClassNotFoundException. Detail see bug comments.
>>
>> Thanks
>> Yumin *
>
More information about the jdk9-dev
mailing list