RFR: 8213486: SIGSEGV in CompiledMethod::cleanup_inline_caches_impl with AOT
dean.long at oracle.com
dean.long at oracle.com
Tue Nov 20 18:21:33 UTC 2018
OK. I agree it makes sense to move the unloading from CompiledMethod to
nmethod. I was just curious what problem you were running into with AOT,
because the iterators look OK to me. You probably ran into trouble here:
// Clean inline caches pointing to both zombie and not_entrant methods
*if* (clean_all
<https://java.se.oracle.com/source/s?defs=clean_all&project=jdk-jdk> ||
!nm
<https://java.se.oracle.com/source/s?defs=nm&project=jdk-jdk>->is_in_use
<https://java.se.oracle.com/source/s?defs=is_in_use&project=jdk-jdk>()
|| nm
<https://java.se.oracle.com/source/s?defs=nm&project=jdk-jdk>->is_unloading
<https://java.se.oracle.com/source/s?defs=is_unloading&project=jdk-jdk>()
|| (nm
<https://java.se.oracle.com/source/s?defs=nm&project=jdk-jdk>->method
<https://java.se.oracle.com/source/s?defs=method&project=jdk-jdk>()->code
<https://java.se.oracle.com/source/s?defs=code&project=jdk-jdk>() != nm
<https://java.se.oracle.com/source/s?defs=nm&project=jdk-jdk>)) {
because !is_in_use() would be false for the not_used state.
dl
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