RFR(10)(M): JDK-8164563: Test nsk/jvmti/CompiledMethodUnload/compmethunload001 keeps reporting: PRODUCT BUG: class was not unloaded in 5
Chris Plummer
chris.plummer at oracle.com
Thu May 4 22:38:45 UTC 2017
Hello,
Please review the following changes:
http://cr.openjdk.java.net/~cjplummer/8164563/webrev.00/webrev.hotspot/
https://bugs.openjdk.java.net/browse/JDK-8164563
There was an issue with CompileMethodUnload events not getting
delivered. Short story is the root cause was the
JvmtiDeferredEventQueue::_pending_list, which upon further review was
deemed unnecessary, so all code related to it has been pulled.
The _pending_list is a temporary list for CompileMethodUnload events
that occur while at a safepoint. Putting them directly on the
JvmtiDeferredEventQueue was thought not to be allowed at a safepoint,
because doing so required acquiring the Service_lock, and it was thought
that you can no do that while at a safepoint.
The issue with the _pending_list is that it only gets processed if there
is a subsequent JvmtiDeferredEventQueue::enqueue() call. For the test in
question, this was not always happening. The test sits in a loop waiting
for the unload events, but unless it triggers some compilation during
this time, which results in enqueue() being called for the
CompileMethodLoad event, it will never see the CompileMethodUnload
events. It eventually gives up and fails. Most times however there is a
compilation triggered while in the loop so the test passes.
The first attempted solution was to use a VM op that triggered
processing of the _pending_list. However, this also ran up against the
issue of not being able to grab the Service_lock while at a safepoint
because even _concurrent VM ops can end up being run synchronously and
at a safepoint if you are already in a VMThread.
After further review of the safepoint concern with the Service_lock, it
was determined that it should be ok to grab it while at a safepoint,
thus removing the need for the _pending_list. So basically the fix is to
remove all _pending_list code, and have
nmethod::post_compiled_method_unload() always directly call
JvmtiDeferredEventQueue::enqueue().
I tested by running the failing test at least 100 times on all supported
platforms (it used to fail with a fairly high frequency). I also ran our
other CompileMethodUnload and CompileMethodLoad tests about 100 times,
and ran our full jvmti test suite a few times on each platform, along
with the jck/vm/jvmti tests.
thanks,
Chris
More information about the serviceability-dev
mailing list