[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
Hi,
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/
*Problem*
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
interpreter.
*Solution
*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.
*
Testing
*Failing test (runThese)
JPRT
Thanks,
Tobias
[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