RFR(xs) 8223336: Assert in VirtualMemoryTracker::remove_released_region when running the SharedArchiveConsistency.java test with -XX:NativeMemoryTracking=detail

Zhengyu Gu zgu at redhat.com
Fri May 31 00:18:14 UTC 2019


Sorry. I think MemTracker::record_virtual_memory_reserve() should be 
called before ReadFile() call, so it has a record for succeeded case.

E.g.
     if (base == NULL) {
       log_info(os)("VirtualAlloc() failed: GetLastError->%ld.", 
GetLastError());
       CloseHandle(hFile);
       return NULL;
     }

     // Record virtual memory allocation
     MemTracker::record_virtual_memory_reserve((address)addr, bytes, 
CALLER_PC);

     DWORD bytes_read;
     OVERLAPPED overlapped;
     overlapped.Offset = (DWORD)file_offset;
     overlapped.OffsetHigh = 0;
     overlapped.hEvent = NULL;
     // ReadFile guarantees that if the return value is true, the requested
     // number of bytes were read before returning.
     bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, 
&overlapped) != 0;
     if (!res) {
       log_info(os)("ReadFile() failed: GetLastError->%ld.", 
GetLastError());
       release_memory(base, bytes);
       CloseHandle(hFile);
       return NULL;
     }


-Zhengyu


On 5/30/19 7:52 PM, Calvin Cheung wrote:
> Hi Zhengyu,
> 
> Thanks for your review.
> 
> Here's an updated webrev with your suggested change:
>      http://cr.openjdk.java.net/~ccheung/8223336/webrev.02/
> 
> thanks,
> Calvin
> 
> On 5/30/19, 4:25 PM, Zhengyu Gu wrote:
>> Hi Calvin,
>>
>> Thanks for fixing it.
>>
>> Since VirtualAlloc call has MEM_COMMIT flag set, I think it should be 
>> tracked as committed memory, e.g.
>>
>> MemTracker::record_virtual_memory_reserve_and_commit((address)addr, 
>> bytes, CALLER_PC);
>>
>> -Zhengyu
>>
>> On 5/30/19 4:04 PM, Calvin Cheung wrote:
>>> bug: https://bugs.openjdk.java.net/browse/JDK-8223336
>>>
>>> webrev: http://cr.openjdk.java.net/~ccheung/8223336/webrev.00/
>>>
>>> A simple fix is adding the missing call to 
>>> MemTracker::record_virtual_memory_reserve() in the Windows version of 
>>> os::pd_map_memory().
>>> On platforms other than Windows, the os::pd_map_memory() doesn't call 
>>> release_memory() and the caller (os::map_memory()) calls 
>>> MemTracker::record_virtual_memory_reserve() if the returned value 
>>> from os::pd_map_memory() is non-NULL. That's why this bug reproduces 
>>> only on Windows.
>>>
>>> Testing: ran SharedArchiveConsistency.java with 
>>> -XX:NativeMemoryTracking=detail on Windows;
>>>               ran all runtime/NMT tests on Windows.
>>>
>>> thanks,
>>> Calvin


More information about the hotspot-runtime-dev mailing list