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

Coleen Phillimore coleen.phillimore at oracle.com
Tue Jul 15 14:30:59 UTC 2014

On 7/14/14, 9:21 PM, Vladimir Kozlov wrote:
> Impressive work, Tobias!

I agree!  This was a tricky case and hard to reproduce.  Were you able 
to create a small test case for it that would be useful to add?

I have a comment about the code.

*+           if (csc->is_call_to_interpreted() && stub_contains_dead_metadata(is_alive, csc->destination())) {*
*+             csc->set_to_clean();*
*+           }*

This appears in each case.  Can you fold it and the new function into a 
function like clean_call_to_interpreted_stub(is_alive, csc)?


> So before the permgen removal embedded method* were oops and they were 
> processed in relocInfo::oop_type loop.
> May be instead of specializing opt_virtual_call_type and 
> static_call_type call site you can simple add a loop for 
> relocInfo::metadata_type (similar to oop_type loop)?
> Thanks,
> Vladimir
> On 7/14/14 4:56 AM, Tobias Hartmann wrote:
>> 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)
>> 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