RFR: 8203885: ConcurrentLocksDump::dump_at_safepoint() should not allocate array in resource area

Per Liden per.liden at oracle.com
Mon May 28 13:05:30 UTC 2018


On 05/28/2018 02:47 PM, David Holmes wrote:
> Hi Per,
> 
> On 28/05/2018 10:16 PM, Per Liden wrote:
>> ConcurrentLocksDump::dump_at_safepoint() creates a GrowableArray, 
>> which gets allocated in a resource area. This array is than passed 
>> down a call chain, where it can't control that another ResourceMark 
>> isn't created. In the leaf of this call chain, a closure 
>> (FindInstanceClosure) is executed, which appends to the array, which 
>> means it might need to be resized. This doesn't work if a new 
>> ResourceMark has been created, since the array resize will happen in a 
>> nested ResourceArea context. As a result, the append operation fails 
>> in GenericGrowableArray::check_nesting().
>>
>> This has so far gone unnoticed because CollectedHeap::object_iterate() 
>> in existing collectors typically don't create new ResourceMarks. This 
>> is not true for ZGC (and potentially other concurrent collectors), 
>> which needs to walk thread stacks, which in turn requires a ResourceMark.
>>
>> The proposed fix is to make this array C Heap allocated.
> 
> That seems fine in itself but I'm not clear what the OOM behaviour of 
> either the old or the new code is here??

Thanks for looking at this David.

On OOM, both the old and the new code will eventually end up in 
vm_exit_out_of_memory().

/Per

> 
> Thanks,
> David
> 
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8203885
>> Webrev: http://cr.openjdk.java.net/~pliden/8203885/webrev.0
>>
>> Testing: hs-tier{1,3}
>>
>> /Per


More information about the hotspot-dev mailing list