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

Vladimir Kozlov vladimir.kozlov at oracle.com
Tue Nov 20 18:08:29 UTC 2018

To clarify.

'invalid' state is set only for AOT methods which never was registers (their state is 'not_set' and corresponding class 
was not initialized yet). Such methods are never visible to iterators and IC caches.

If aot method is registered its state become 'in_use' and in such case it is treated and processed as normal nmethod. 
And AOTCompiledMethod structure is created only for such case.


On 11/20/18 3:12 AM, Erik Österlund wrote:
> 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.
> Thanks,
> /Erik
> 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