RFR (S): 8239070: Memory leak when unsuccessfully mapping in archive regions

Kim Barrett kim.barrett at oracle.com
Tue Feb 18 20:30:28 UTC 2020


> On Feb 18, 2020, at 1:00 PM, Ioi Lam <ioi.lam at oracle.com> wrote:
> 
> The changes look OK to me.
> 
> I think this line doesn't need to be changed.
> 
> 1820   *heap_mem = cleanup._regions;

+1

I don’t need a new webrev for revert of line 1820.

> 
> Thanks
> - Ioi
> 
> On 2/18/20 8:03 AM, Thomas Schatzl wrote:
>> Hi,
>> 
>> On 15.02.20 09:20, Kim Barrett wrote:
>>>> On Feb 14, 2020, at 11:08 AM, Ioi Lam <ioi.lam at oracle.com> wrote:
>>>> 
>>>> Hi Thomas,
>>>> 
>>>> Thanks for fixing this issue. Freeing the array at each exit point seems error prone. How about: refactoring the function to a FileMapInfo::map_heap_data_impl function, allocate inside FileMapInfo::map_heap_data(), call map_heap_data() and if it returns false, free the array in a single place.
>>> 
>>> Rather than splitting up the function, one could add a local cleanup handler:
>>> 
>>>    ... create and initialize regions object ...
>>>    struct Cleanup {
>>>      MemRegion* _regions;
>>>      bool _aborted;
>>>      Cleanup(MemRegion* regions) : _regions(regions), _aborted(true) {}
>>>      ~Cleanup() { if (_aborted) FREE_C_HEAP_ARRAY(MemRegion, _regions); }
>>>    } cleanup(regions);
>>>    ...
>>>    cleanup._aborted = false;
>>>    return true;
>>> }
>>> 
>> 
>>   I implemented that as it is least intrusive in the end.
>> 
>> http://cr.openjdk.java.net/~tschatzl/8239070/webrev.1/ (full, no point in providing diff)
>> 
>> Thanks,
>>   Thomas




More information about the hotspot-gc-dev mailing list