RFR(S): 8191229: serviceability/jvmti/GetOwnedMonitorInfo/GetOwnedMonitorInfoTest.java fails with NoClassDefFoundError

Chris Plummer chris.plummer at oracle.com
Thu Dec 7 04:47:39 UTC 2017


On 12/6/17 8:04 PM, Chris Plummer wrote:
> On 12/6/17 7:38 PM, David Holmes wrote:
>> On 7/12/2017 1:08 PM, Chris Plummer wrote:
>>> On 12/6/17 6:47 PM, David Holmes wrote:
>>>> Hi Chris,
>>>>
>>>> On 7/12/2017 8:38 AM, Chris Plummer wrote:
>>>>> Hello,
>>>>>
>>>>> Please review the following:
>>>>>
>>>>> https://bugs.openjdk.java.net/browse/JDK-8191229
>>>>> http://cr.openjdk.java.net/~cjplummer/8191229/webrev.00/
>>>>
>>>> I expected to see the initialization done in JNI_OnLoad, not in a 
>>>> new init() method.
>>> I was worried it wouldn't work because of JDK-8188052, but I guess 
>>> that only impacts JNI_OnUnload. I can change it to init from 
>>> JNI_OnLoad().
>>
>> Yes please use JNI_OnLoad.
> Having issues with that. The IsInstanceOf() done during the jvmti 
> callback is crashing in JNIHandles::resolve_non_null(). Something is 
> messed up about the testclass handle, but I can't figure out what. I'm 
> initializing it the same way, except in OnLoad() rather than in init().
>
> JNIEXPORT jint JNICALL
> JNI_OnLoad(JavaVM *jvm, void *reserved) {
>     jint res;
>     JNIEnv *env;
>
>     res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &env),
>                                    JVMTI_VERSION_1);
>     testClass = (*env)->FindClass(env, TEST_CLASS);
>     if (testClass != NULL) {
>       testClass = (*env)->NewGlobalRef(env, testClass);
>     }
>     return JNI_VERSION_1_8;
> }
>
> Very strange.
Interesting. The problem was passing JVMTI_VERSION_1 into GetEnv() 
instead of JNI_VERSION_1_8. I'm not sure why that was problematic, but 
changing it to JNI_VERSION_1_8 fixed the problem. I had copied this 
GetEnv() code from Agent_Initialize(), but there it was used to get the 
jvmtiEnv*, and seemed to be working ok, at least for the use of the 
jvmtiEnv* in that function. The other jvmti tests are using 
JVMTI_VERSION_9, but I think most of them are new in 9. I don't know 
when GetOwnedMonitorInfo was introduced, but maybe it should also be 
updated to specify JVMTI_VERSION_9.

Chris
>
> Chris
>>
>> Thanks,
>> David
>>>
>>> Chris
>>>>
>>>> David
>>>> -----
>>>>
>>>>> The test is testing contended monitor support. After registering 
>>>>> the callback, it gets an unexpected notification of a contended 
>>>>> monitor, which is happening while the finalizer thread is running. 
>>>>> In the callback the test does a FindClass to find a test class, 
>>>>> but the classloader context is not correct when the finalizer 
>>>>> thread is current, so FindClass fails and leaves an exception 
>>>>> pending (probably blowing away the finalzer thread) and also 
>>>>> (separately) causes the test to fail. It's unknown why this 
>>>>> callback is suddenly being triggered, but the callback itself is 
>>>>> not a bug, and the test needs to defend against it.
>>>>>
>>>>> The fix is to lookup the test class during test initialization and 
>>>>> keep it cached, rather than look it up every time there is a 
>>>>> contended monitor callback.
>>>>>
>>>>> thanks,
>>>>>
>>>>> Chris
>>>
>>>
>
>




More information about the serviceability-dev mailing list