C1 code installation and JNIHandle::deleted_handle() oop
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Tue Nov 14 18:38:33 UTC 2017
>> However, as Aleksey pointed out, we hit JNIHandles::resolve() in
>> product path, JVMCI or not, and this touches the naked oop by
>> comparing it with another oop. This doesn't sound like a reliable
>> thing to do.
> Scratch that. Looking at the code paths again, this doesn't seem to be
> true. I.e. we hit JNIHandles::resolve() only in assert and ObjectLookup
> (I trust you that it's only JVMCI). Not sure if it can be robust to
> compare oops in assert paths. It sure is a race and doesn't feel very well.
>
> I wonder if we should introduce a CollectedHeap::is_in_or_null(jobject)
> method, and let the GC figure it out. It might actually have a way to
> check it (simple address range check) without sending the thread to VM
> state.
Yes, the assert just sanity checks that the handlized oop points into
the heap.
Depending on the complexity of the check, I'd consider the following
options:
* dedicated CollectedHeap::is_in_or_null(jobject)
* ThreadInVMfromNative under #ifdef ASSERT (or factored out)
* completely remove the assert
Best regards,
Vladimir Ivanov
>>
>> This simple change seems to fix it:
>> https://paste.fedoraproject.org/paste/poQ5caTCuN6jHSGbK1n0iQ
>>
>> Doing more testing...
>>
>> Roman
>>
>>> Anyway, I'll file a bug to investigate ObjectLookup::find_index().
>>>
>>> Best regards,
>>> Vladimir Ivanov
>>>
>>> On 11/14/17 6:45 PM, Roman Kennke wrote:
>>>> The code below the assert also unwraps the oop and does lookups with
>>>> it. I'm not on my computer but I can dig out the relevant parts when
>>>> I'm back at work...
>>>>
>>>> Roman
>>>>
>>>>
>>>> Am 14. November 2017 16:36:10 MEZ schrieb Vladimir Ivanov
>>>> <vladimir.x.ivanov at oracle.com>:
>>>>
>>>> Aleksey,
>>>>
>>>> I agree with your & Roman analysis: compilers shouldn't touch
>>>> naked oops
>>>> unless the thread is in _thread_in_vm mode.
>>>>
>>>> Looking at the crash log, the problematic code is under assert:
>>>>
>>>> void ConstantOopWriteValue::write_on(DebugInfoWriteStream*
>>>> stream) {
>>>> assert(JNIHandles::resolve(value()) == NULL ||
>>>> Universe::heap()->is_in_reserved(JNIHandles::resolve(value())),
>>>> "Should be in heap");
>>>> stream->write_int(CONSTANT_OOP_CODE);
>>>> stream->write_handle(value());
>>>> }
>>>>
>>>> So, the proper fix would be to make the verification code more
>>>> robust.
>>>>
>>>> Best regards,
>>>> Vladimir Ivanov
>>>>
>>>> On 11/14/17 5:16 PM, Aleksey Shipilev wrote:
>>>>
>>>> Hi,
>>>>
>>>> In some of our aggressive test configurations for
>>>> Shenandoah, we
>>>> sometimes see the following failure:
>>>> http://cr.openjdk.java.net/~shade/shenandoah/c1-race-fail-hs_err.log
>>>>
>>>> It seems to happen when C1 code installation is happening
>>>> during
>>>> Full GC.
>>>>
>>>> The actual failure is caused by touching the
>>>> JNIHandles::deleted_handle() oop in
>>>> JNIHandles::guard_value() during JNIHandles::resolve() against
>>>> the constant oop handle when we are
>>>> recording the debugging information for C1-generated Java call:
>>>> http://hg.openjdk.java.net/jdk/hs/file/5caa1d5f74c1/src/hotspot/share/runtime/jniHandles.hpp#l220
>>>>
>>>>
>>>> The C1 thread is in _thread_in_native state, and so the runtime
>>>> thinks the thread is at safepoint,
>>>> but the thread touches the deleted_handle oop(). When
>>>> Shenandoah
>>>> dives into Full GC and moves that
>>>> object at the same time, everything crashes and burns.
>>>>
>>>> Is C1 (and any other compiler thread) supposed to transit to
>>>> _vm_state when touching the naked oops,
>>>> and thus coordinate with safepoints? I see VM_ENTRY_MARK all
>>>> over ci* that seems to transit there
>>>> before accessing the heap. Does that mean we need the same
>>>> everywhere around JNIHandles::resolve too?
>>>>
>>>> Or is there some other mechanism that is supposed to get
>>>> compiler threads to coordinate with GC?
>>>>
>>>> Thanks,
>>>> -Aleksey
>>>>
>>>>
>>>> --
>>>> Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet.
>>
>>
>
More information about the hotspot-compiler-dev
mailing list