RFR(s): 8228758: assert(_no_handle_mark_nesting == 0) failed: allocating handle inside NoHandleMark
robbin.ehn at oracle.com
Fri Aug 30 06:56:05 UTC 2019
Hi David, thanks for having a look!
On 2019-08-30 03:24, David Holmes wrote:
> Hi Robbin,
> On 29/08/2019 10:48 pm, Robbin Ehn wrote:
>> Hi all, please review.
>> The JNI_QUICK_ENTRY/JVM_QUICK_ENTRY skips creating the HandleMarkCleaner,
>> instead they have a NoHandleMark. Handshakes can
>> be executed by the JavaThread itself, thus might require a
>> HandleMark. QUICK entries allow polls for safepoint/handshakes, if a
>> handshake is executed and a HandleMark is created we hit this
>> HandleMarkCleaner have previous been optimized for inlining, thus cheap.
>> Performance benchmarks shows no benefit of not allowing HandleMark.
>> This changeset removes the the QUICK entry and avoids this issue.
>> Note that JNI_QUICK_ENTRY also don't have WeakPreserveExceptionMark,
>> so it's changed to JNI_ENTRY_NO_PRESERVE.
> Why did you extend this to the JNI_QUICK_ENTRY case when the impacted code was
> only a JVM_QUICK_ENTRY? The expanded scope of the change seems unnecessary given
> this is just a workaround for a particular failure mode.
- If your code require you not to use any HandleMarks it most likely require no
polls, for correctness. JRT_LEAF does this correctly, sets up both
NoSafepointVerifier and NoHandleMark. (with the HandleMark in handshake we now
always require NoSafepointVerifier if you use NoHandleMark for correctness)
- There is no performance benefit, so we just have extra code which is useless.
- It might be affected, I have not track down every path. But even if it's
not, nothing is stopping someone from accidentally changing the code to call
something which does a poll, since we don't have NoSafepointVerifier.
So we avoid getting the same failure mode in future.
- Reducing the complexity of interafceSupport is always good!
- There was no reason to keep it.
So if you don't a very strong opinion about it, I really like to get rid of it.
Some extra words about NoHandleMark:
I believe NoHandleMark should be removed.
In the LEAF case, there is no point in creating a Handle within a
NoSafepointVerifier, since we don't safepoint.
The other usecase seems to be, I'm in java don't do VM things, and someone tried
to protected that with a NoHandleMark. There many ways to create a much more
robust check for that.
But a discussion for another time.
>> Passes t1-3 (and performance benchmarks)
>> Thanks, Robbin
More information about the hotspot-runtime-dev