RFR: 8213486: SIGSEGV in CompiledMethod::cleanup_inline_caches_impl with AOT
erik.osterlund at oracle.com
Tue Nov 20 11:12:31 UTC 2018
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
> 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()?
More information about the hotspot-dev