[9] RFR(S): 8029443: 'assert(klass->is_loader_alive(_is_alive)) failed: must be alive' during VM_CollectForMetadataAllocation

Tobias Hartmann tobias.hartmann at oracle.com
Mon Jul 14 11:56:52 UTC 2014


please review the following patch for JDK-8029443.

Bug: https://bugs.openjdk.java.net/browse/JDK-8029443
Webrev: http://cr.openjdk.java.net/~thartmann/8029443/webrev.00/

After the tracing/marking phase of GC, nmethod::do_unloading(..) checks 
if a nmethod can be unloaded because it contains dead oops. If class 
unloading occurred we additionally clear all ICs where the cached 
metadata refers to an unloaded klass or method. If the nmethod is not 
unloaded, nmethod::verify_metadata_loaders(..) finally checks if all 
metadata is alive. The assert in CheckClass::check_class fails because 
the nmethod contains Method* metadata corresponding to a dead Klass.
The Method* belongs to a to-interpreter stub [1] of an optimized 
compiled IC. Normally we clear those stubs prior to verification to 
avoid dangling references to Method* [2], but only if the stub is not in 
use, i.e. if the IC is not in to-interpreted mode. In this case the 
to-interpreter stub may be executed and hand a stale Method* to the 

*The implementation of nmethod::do_unloading(..) is changed to clean 
compiled ICs and compiled static calls if they call into a 
to-interpreter stub that references dead Method* metadata.

The patch was affected by the G1 class unloading changes (JDK-8048248) 
because the method nmethod::do_unloading_parallel(..) was added. I 
adapted the implementation as well.
*Failing test (runThese)


[1] see CompiledStaticCall::emit_to_interp_stub(..)
[2] see nmethod::verify_metadata_loaders(..), 
static_stub_reloc()->clear_inline_cache() clears the stub

More information about the hotspot-dev mailing list