RFR: 8168914: Crash in ClassLoaderData/JNIHandleBlock::oops_do during concurrent marking
David Holmes
david.holmes at oracle.com
Tue Feb 21 02:05:09 UTC 2017
On 21/02/2017 11:57 AM, Kim Barrett wrote:
>> On Feb 20, 2017, at 5:52 PM, David Holmes <david.holmes at oracle.com> wrote:
>>> 02 -> 03:
>>> - Only use load_acquire when reading the size for the "head" chunk
>>
>> Sorry but I don't like the way this is done - the conditional may end up being more expensive than the unnecessary load-acquire. Unrolling the first loop iteration, as per the email discussion, is a better way to go IMO.
>
> +1
>
>> And as Kim indicated you shouldn't need any casts for the OrderAccess ops as you should be using the "void*" versions.
>>
>>> - Fix grammar in comment
>>> - Refer to the correct lock in comment
>>>
>>> AFAICS (scanning through all the emails) there are now only three
>>> remaining comments:
>>> - Thomas: can we assert in ChunkedHandeList::add that the correct mutex
>>> is locked?
>>> - Then we would have to pass the mutex along as a parameter to `add`,
>>
>> Why do you need to pass it in?
>>
>> oop* ClassLoaderData::ChunkedHandleList::add(oop o) {
>> assert(ClassLoaderData::metaspace_lock()->owned_by_self(), "should own lock");
>
> The metaspace_lock() is per-CLD, so that doesn’t work.
Ah! The use of ClassLoaderData::metaspace_lock() in the comment threw
me. So we could have the ChunkHandleList store a back-pointer to the CLD
that owns it. But for a single method with a single caller this seems
like overkill.
BTW not sure about nested classes in C++ but does anything in
ChunkHandleList need to be public?
Thanks,
David
More information about the hotspot-dev
mailing list