RFR: 8233299: Implementation: JEP 365: ZGC on Windows
erik.osterlund at oracle.com
erik.osterlund at oracle.com
Tue Nov 5 10:40:53 UTC 2019
Hi Stefan,
Awesome. Looks good!
Thanks,
/Erik
On 10/31/19 11:18 AM, Stefan Karlsson wrote:
> 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 hotspot-gc-dev
mailing list