RFR: 8215889: assert(!_unloading) failed: This oop is not available to unloading class loader data with ZGC

Erik Österlund erik.osterlund at oracle.com
Mon Jan 7 09:51:43 UTC 2019


Hi,

There are SpeculativeTrapData entries in the extra data space of MDOs 
that are currently not being checked for stale Method* entries due to 
concurrent class unloading.

The fix involves lazily cleaning SpeculativeTrapData entries during 
ciMethodData::load_extra_data(), which unpacks the extra data from the 
source MDO to the ci copy of the MDO, that the compiler subsequently 
uses as reference during the ongoing compilation, and needs to have live 
metadata only.

A new ciMethodData::prepare_metadata() method is added to ci MDO mirrors 
that lazily cleans the extra data space and pre-caches the ciEnv with 
all the metadata it encounters. When creating ciMethod handles, the 
Compile_lock might be taken, which strictly requires safepoint checking. 
Therefore, prepare_metadata() loops until it can pre-cache all live 
metadata without any cache misses, because that implies the subsequent 
code copying the MDO can not safepoint while extracting the extra data 
from the MDO, which is a requirement as 1) a safepoint may invalidate 
the metadata again, 2) both the cleaning (from the concurrent GC thread) 
and extraction (from the compiler thread) must be done under the 
mdo->extra_data_lock().

Bug:
https://bugs.openjdk.java.net/browse/JDK-8215889

Webrev:
http://cr.openjdk.java.net/~eosterlund/8215889/webrev.00/

Testing: hs-tier1-6, and a bunch of local testing, including 24 hours 
kitchensink in fastdebug.

Thanks,
/Erik


More information about the hotspot-dev mailing list