NMT: Weird merging of regions
Stefan Karlsson
stefan.karlsson at oracle.com
Wed Jan 24 15:17:48 UTC 2018
Hi Zhengyu (all),
I was looking at the NMT output from one of our stress tests and saw
something unexpected. It looks like the first number commits of small
ZPages get merged into one region, until we allocate a medium ZPage
which ends up at the end of the virtual address space. After the medium
ZPage has been allocated non of the subsequent small ZPages get merged.
I traced the committing of memory:
[0.079s][info][gc ] nmt_commit 0x0000040000000000 514048K
[2.523s][info][gc ] nmt_commit 0x000004001f600000 2048K
[2.528s][info][gc ] nmt_commit 0x000004001f800000 2048K
[2.533s][info][gc ] nmt_commit 0x000004001fa00000 2048K
[2.535s][info][gc ] nmt_commit 0x000004001fc00000 2048K
[2.537s][info][gc ] nmt_commit 0x000004001fe00000 2048K
[2.538s][info][gc ] nmt_commit 0x0000040020000000 2048K
[2.543s][info][gc ] nmt_commit 0x0000040020200000 2048K
[2.547s][info][gc ] nmt_commit 0x0000040020400000 2048K
...
[3.714s][info][gc ] nmt_commit 0x000004003c200000 2048K
[3.715s][info][gc ] nmt_commit 0x000004003c400000 2048K
[3.731s][info][gc ] nmt_commit 0x000007fffe000000 32768K
[3.737s][info][gc ] nmt_commit 0x000007fffc000000 32768K
[3.737s][info][gc ] nmt_commit 0x000004003c600000 2048K
[3.741s][info][gc ] nmt_commit 0x000004003c800000 2048K
The output from NMT is:
[0x0000040000000000 - 0x000004001f600000] committed 514048KB from
[0x00002b9e6209618b]
ZPreMappedMemory::ZPreMappedMemory(ZVirtualMemoryManager&,
ZPhysicalMemoryManager&, unsigned long)+0xfb
[0x00002b9e6208e277] ZPageAllocator::ZPageAllocator(unsigned long,
unsigned long, unsigned long)+0x67
[0x00002b9e620706fc] ZHeap::ZHeap()+0xac
[0x00002b9e6206c2c9]
ZCollectedHeap::ZCollectedHeap(ZCollectorPolicy*)+0x49
[0x000004001f600000 - 0x000004003c600000] committed 475136KB from
[0x00002b9e620907bb] ZPageAllocator::alloc_page(unsigned char,
unsigned long, ZAllocationFlags)+0x9b
[0x00002b9e620712e7] ZHeap::alloc_page(unsigned char, unsigned
long, ZAllocationFlags)+0x17
[0x00002b9e6207faa4]
ZObjectAllocator::alloc_object_in_shared_page(ZPage**, unsigned char,
unsigned long, unsigned long, ZAllocationFlags)+0x114
[0x00002b9e62081853] ZObjectAllocator::alloc_object(unsigned
long)+0x103
[0x000004003c600000 - 0x000004003c800000] committed 2048KB from
[0x00002b9e620907bb] ZPageAllocator::alloc_page(unsigned char,
unsigned long, ZAllocationFlags)+0x9b
[0x00002b9e620712e7] ZHeap::alloc_page(unsigned char, unsigned
long, ZAllocationFlags)+0x17
[0x00002b9e6207faa4]
ZObjectAllocator::alloc_object_in_shared_page(ZPage**, unsigned char,
unsigned long, unsigned long, ZAllocationFlags)+0x114
[0x00002b9e62081853] ZObjectAllocator::alloc_object(unsigned
long)+0x103
[0x000004003c800000 - 0x000004003ca00000] committed 2048KB from
[0x00002b9e620907bb] ZPageAllocator::alloc_page(unsigned char,
unsigned long, ZAllocationFlags)+0x9b
[0x00002b9e620712e7] ZHeap::alloc_page(unsigned char, unsigned
long, ZAllocationFlags)+0x17
[0x00002b9e6207faa4]
ZObjectAllocator::alloc_object_in_shared_page(ZPage**, unsigned char,
unsigned long, unsigned long, ZAllocationFlags)+0x114
[0x00002b9e62081853] ZObjectAllocator::alloc_object(unsigned
long)+0x103
As can be seen all pages between:
[2.523s][info][gc ] nmt_commit 0x000004001f600000 2048K
and:
[3.715s][info][gc ] nmt_commit 0x000004003c400000 2048K
are merged into:
[0x000004001f600000 - 0x000004003c600000] committed 475136KB from
However the small page commits after the medium page commits all get
separate entries.
I looked at the code in add_committed_region and this seems to be
intentionally:
// special case to expand prior region if there is no next region
but I don't understand the _reason_ why we don't merge the added region
with adjacent next regions.
Zhengyu, do you know/remember the motivation behind this?
I created a patch to try to merge with the next region:
http://cr.openjdk.java.net/~stefank/zgc/zNMTMerging/webrev.01/
This yields NMT output like the following:
[0x0000040000000000 - 0x000004001f600000] committed 514048KB from
[0x00002b26cda232db]
ZPreMappedMemory::ZPreMappedMemory(ZVirtualMemoryManager&,
ZPhysicalMemoryManager&, unsigned long)+0xfb
[0x00002b26cda1b3c7] ZPageAllocator::ZPageAllocator(unsigned long,
unsigned long, unsigned long)+0x67
[0x00002b26cd9fd84c] ZHeap::ZHeap()+0xac
[0x00002b26cd9f9419]
ZCollectedHeap::ZCollectedHeap(ZCollectorPolicy*)+0x49
[0x000004001f600000 - 0x0000040380800000] committed 14174208KB from
[0x00002b26cda1d90b] ZPageAllocator::alloc_page(unsigned char,
unsigned long, ZAllocationFlags)+0x9b
[0x00002b26cd9fe437] ZHeap::alloc_page(unsigned char, unsigned
long, ZAllocationFlags)+0x17
[0x00002b26cda0cbf4]
ZObjectAllocator::alloc_object_in_shared_page(ZPage**, unsigned char,
unsigned long, unsigned long, ZAllocationFlags)+0x114
[0x00002b26cda0e9a3] ZObjectAllocator::alloc_object(unsigned
long)+0x103
[0x000007ffce000000 - 0x0000080000000000] committed 819200KB from
[0x00002b26cda1d90b] ZPageAllocator::alloc_page(unsigned char,
unsigned long, ZAllocationFlags)+0x9b
[0x00002b26cd9fe437] ZHeap::alloc_page(unsigned char, unsigned
long, ZAllocationFlags)+0x17
[0x00002b26cda0cbf4]
ZObjectAllocator::alloc_object_in_shared_page(ZPage**, unsigned char,
unsigned long, unsigned long, ZAllocationFlags)+0x114
[0x00002b26cda0e935] ZObjectAllocator::alloc_object(unsigned long)+0x95
StefanK
More information about the zgc-dev
mailing list