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.
Vladimir
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