Fwd: RFR: 8233299: Implementation: JEP 365: ZGC on Windows
Stefan Karlsson
stefan.karlsson at oracle.com
Fri Nov 22 15:37:52 UTC 2019
Thanks, Erik.
StefanK
On 2019-11-22 15:24, Erik Joelsson wrote:
> Build change looks good.
>
> /Erik
>
> On 2019-11-21 13:11, Stefan Karlsson wrote:
>> Hi,
>>
>> I'm looking for a review for this tiny build change:
>> https://cr.openjdk.java.net/~stefank/8233299/webrev.01/make/autoconf/hotspot.m4.udiff.html
>>
>>
>> Thanks,
>> StefanK
>>
>> -------- Forwarded Message --------
>> Subject: RFR: 8233299: Implementation: JEP 365: ZGC on Windows
>> Date: Thu, 31 Oct 2019 11:18:20 +0100
>> From: Stefan Karlsson <stefan.karlsson at oracle.com>
>> To: hotspot-gc-dev <hotspot-gc-dev at openjdk.java.net>
>>
>>
>>
>> Hi all,
>>
>> Please review this patch to add ZGC support on Windows.
>>
>> https://cr.openjdk.java.net/~stefank/8233299/webrev.01/
>> https://bugs.openjdk.java.net/browse/JDK-8233299
>>
>> As mentioned in the JEP (https://openjdk.java.net/jeps/365), there
>> were some preparation patches that needed to go in to pave the way for
>> this patch:
>>
>> 8232601: ZGC: Parameterize the ZGranuleMap table size
>> 8232602: ZGC: Make ZGranuleMap ZAddress agnostic
>> 8232604: ZGC: Make ZVerifyViews mapping and unmapping precise
>> 8232648: ZGC: Move ATTRIBUTE_ALIGNED to the front of declarations
>> 8232649: ZGC: Add callbacks to ZMemoryManager
>> 8232650: ZGC: Add initialization hooks for OS specific code
>> 8232651: Add implementation of os::processor_id() for Windows
>>
>> ... they have all been pushed now.
>>
>> One important key-point to this implementation is to use the new
>> Windows APIs that support reservation and mapping of memory through
>> "placeholders": VirtualAlloc2, VirtualFreeEx, MapViewOfFile3, and
>> UnmapViewOfFile2. These functions are available starting from version
>> 1803 of Windows 10 and Windows Server. ZGC will lookup these symbols
>> to determine if the Windows version supports these functions.
>>
>>
>> Correlating the text in the JEP with the code:
>>
>> * '"Support for multi-mapping memory". ZGC's use of colored pointers
>> requires support for heap multi-mapping, so that the same physical
>> memory can be accessed from multiple different locations in the
>> process address space. On Windows, paging-file backed memory provides
>> physical memory with an identity (a handle), which is unrelated to the
>> virtual address where it is mapped. Using this identity allows ZGC to
>> map the same physical memory into multiple locations.'
>>
>> We commit memory via paging file mappings and map views into that memory.
>>
>> The function ZMapper::create_and_commit_paging_file_mapping uses
>> CreateFileMappingW with SEC_RESERVE to create this mapping,
>> MapViewOfFile3 to map a temporary view into the mapping, VirtualAlloc2
>> to commit the memory, and then UnmapViewOfFile2 to unmap the view.
>>
>> The reason to use SEC_RESERVE and the extra VirtualAlloc2, instead of
>> SEC_COMMIT, is to ensure that the later multi-mappings of committed
>> file mappings don't fail under low-memory situations. Earlier
>> prototypes used SEC_COMMIT and saw these kind of OOME errors when
>> mapping new views to already committed memory. The current
>> platform-independent ZGC code isn't prepared to handle OOME errors
>> when mapping views, so we chose this solution.
>>
>> MapViewOfFile3 is then used to multi-map into the committed memory.
>>
>> * '"Support for mapping paging-file backed memory into a reserved
>> address space". The Windows memory management API is not as flexible
>> as POSIX's mmap/munmap, especially when it comes to mapping file
>> backed memory into a previously reserved address space region. To do
>> this, ZGC will use the Windows concept of address space placeholders.
>> The placeholder concept was introduced in version 1803 of Windows 10
>> and Windows Server. ZGC support for older versions of Windows will not
>> be implemented.'
>>
>> Before the placeholder APIs there was no way to first reserve a
>> specific virtual memory range, and then map a view of a committed
>> paging file over that range. The VirtuaAlloc function could be used to
>> first reserve and then commit anonymous memory, but nothing similar
>> existed for mapped views. Now with placeholders, we can create a
>> placeholder reservation of memory with VirtualAlloc2, and then replace
>> that reservation with MapViewOfFile3. When memory is unmapped, we can
>> use UnmapViewOfFile2 to "preserve" the placeholder memory reservation.
>>
>>
>> * '"Support for mapping and unmapping arbitrary parts of the heap".
>> ZGC's heap layout in combination with its dynamic sizing (and
>> re-sizing) of heap pages requires support for mapping and unmapping
>> arbitrary heap granules. This requirement in combination with Windows
>> address space placeholders requires special attention, since
>> placeholders must be explicitly split/coalesced by the program, as
>> opposed to being automatically split/coalesced by the operating system
>> (as on Linux).'
>>
>> Half of the preparation patches were put in place to support this.
>> When replacing a placeholder with a view of the backing file, we need
>> to exactly match the address and size of a placeholder. Also, when
>> unmapping a view, we need to exactly match the address and size of the
>> view, and replace it with a placeholder.
>>
>> To make it easier to map and unmap arbitrary parts of the heap, we
>> split reserved memory into ZGranuleSize-sized placeholders. So,
>> whenever we perform any of these operations, we know that any given
>> memory range could be dealt with as a number of granules.
>>
>> When memory is reserved, but not mapped, it is registered in the
>> ZVirtualMemoryManager. It splits memory into granule-sized placholders
>> when reserved memory is fetched, and coalesces placeholders when
>> reserved memory is handed back.
>>
>>
>> * '"Support for committing and uncommitting arbitrary parts of the
>> heap". ZGC can commit and uncommit physical memory dynamically while
>> the Java program is running. To support these operations the physical
>> memory will be divided into, and backed by, multiple paging-file
>> segments. Each paging-file segment corresponds to a ZGC heap granule,
>> and can be committed and uncommitted independently of other segments.'
>>
>> Just like we can map and unmap in granules, we want to be able to
>> commit and uncommit memory in granules. You can see how memory is
>> committed and uncommitted in granules in
>> ZBackingFile::commit_from_paging_file and
>> ZBackingFile::uncommit_from_paging_file. Each committed granule is
>> associated with one registered handle. When memory for a granule is
>> uncommitted, the handle is closed. At this point, no views exist to
>> the mapping and the memory is handed back to the OS.
>>
>>
>> Final point about ZPhysicalMemoryBacking. We've tried to make this
>> file similar on all OSes, with the hope to be able to combine them
>> when both the Windows and macOS ports have been merged.
>>
>> Thanks,
>> StefanK
More information about the build-dev
mailing list