RFR: 8213486: SIGSEGV in CompiledMethod::cleanup_inline_caches_impl with AOT

Erik Österlund erik.osterlund at oracle.com
Tue Nov 20 11:12:31 UTC 2018

Hi Dean,

Yeah I think I misunderstood what I observed. So what I know is that in 
the code cache unloading, I'm not getting all is_alive() AOT methods 
into my iterator, which messes up the assumptions made by the epoch 
based scheme for AOT methods.

I noticed that in AOTCodeHeap::sweep_dependent_methods(int* indexes, int 
methods_cnt) we make AOTCompiledMethods "invalid" in the AOT heap, 
making it no longer observable from the iterators. Then it calls the 
VM_Deoptimize vm operation after. Throughout all this, the 
AOTCompiledMethod is alive(), yet when the iterators ask for all 
is_alive() AOTCompiledMethods, it won't be visible. But I suppose IC 
caches may still reference these methods and check if it is_unloading, 
and then we blow up. There may possibly be multiple ways for is_alive() 
AOTCompiledMethods to not be visible from iterators yet be visible 
through IC caches using the "invalid" state in the .

Anyway, the fix is the same: stop doing the epoch state thingey for 
is_unloading() on AOTCompiledMethod where it isn't needed, and doesn't 
seem to play well with the rather different life cycle it has, and just 
return false instead.


On 2018-11-20 00:00, dean.long at oracle.com wrote:
> Hi Erik,
> On 11/19/18 12:42 PM, Erik Österlund wrote:
>> ...except it looks like for AOTCompiledMethods when running with 
>> tiered compilation, may first be is_alive(), then become !is_alive() 
>> for a while, and then get resurrected to is_alive() using 
>> make_entrant().
> this doesn't sounds quite right.  AOTCompiledMethods aren't allowed to 
> transition to zombie (!alive), only not_used or not_entrant, which 
> should still have is_alive() returning true. Maybe some code is using 
> is_not_entrant() instead of !is_alive()?
> dl

More information about the hotspot-dev mailing list