RFR: 8312132: Add tracking of multiple address spaces in NMT [v93]
Johan Sjölen
jsjolen at openjdk.org
Mon May 20 09:19:41 UTC 2024
> Hi,
>
> This PR introduces a new abstraction to NMT, named `MemoryFileTracker`. Today, NMT does not track any memory outside of the virtual memory address space. This means that if you allocated memory in something such as a memory-backed file and use `mmap` to map into that memory, then you'll have trouble reporting this to NMT. This is the situation that ZGC is in, and that is what this patch attempts to fix.
>
> ## `MemoryFileTracker`
>
> The `MemoryFileTracker` adds the ability of adding new virtual memory address spaces to NMT and committing memory to these, the basic API is:
>
> ```c++
> static MemoryFile* make_device(const char* descriptive_name);
> static void free_device(MemoryFile* device);
>
> static void allocate_memory(MemoryFile* device, size_t offset, size_t size,
> MEMFLAGS flag, const NativeCallStack& stack);
> static void free_memory(MemoryFile* device, size_t offset, size_t size);
>
>
> It is easiest to see how this is used by looking at what ZGC's `ZNMT` class does:
>
> ```c++
> void ZNMT::reserve(zaddress_unsafe start, size_t size) {
> MemTracker::record_virtual_memory_reserve((address)start, size, CALLER_PC, mtJavaHeap);
> }
> void ZNMT::commit(zoffset offset, size_t size) {
> MemTracker::allocate_memory_in(ZNMT::_device, static_cast<size_t>(offset), size, mtJavaHeap, CALLER_PC);
> }
> void ZNMT::uncommit(zoffset offset, size_t size) {
> MemTracker::free_memory_in(ZNMT::_device, (size_t)offset, size);
> }
>
> void ZNMT::map(zaddress_unsafe addr, size_t size, zoffset offset) {
> // NMT doesn't track mappings at the moment.
> }
> void ZNMT::unmap(zaddress_unsafe addr, size_t size) {
> // NMT doesn't track mappings at the moment.
> }
>
>
> As you can see, any mapping between reserved regions and device-allocated memory is not recorded in NMT. This means that in detailed mode you only get reserved regions printed for the reserved memory, the device-allocated memory is reported separately. When performing summary reporting any memory allocated via these devices is added to the corresponding `MEMFLAGS` as `committed` memory.
>
> This patch is also acting as a base on which we deploy multiple new backend ideas to NMT. These ideas are:
>
> 1. Implement VMA tracking using a balanced binary tree approach. Today's `VirtualMemoryTracker`'s usage of linked lists is slow and brittle, we'd like to move away from it. Our Treap-based approach in this patch gives a performance boost such that we see 25x better performance in a benchmark. The idea and draft of this...
Johan Sjölen has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 182 commits:
- Merge remote-tracking branch 'openjdk/master' into nmt-physical-device
- Allow for up to 3 extra in depth
- Move definition of struct to gain external linkage
Due to mgronlund
- Fix visit_in_order tests
- Find a closer bound for treap depth and express it in base-2 log
- Add corresponding tests to visit_in_order when applicable
- Remove usage of auto in tests
- Merge remote-tracking branch 'openjdk/master' into nmt-physical-device
- Don't look at val, look at key
- Fix test
- ... and 172 more: https://git.openjdk.org/jdk/compare/b92bd671...1c3fb154
-------------
Changes: https://git.openjdk.org/jdk/pull/18289/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=18289&range=92
Stats: 2083 lines in 20 files changed: 1978 ins; 86 del; 19 mod
Patch: https://git.openjdk.org/jdk/pull/18289.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/18289/head:pull/18289
PR: https://git.openjdk.org/jdk/pull/18289
More information about the hotspot-dev
mailing list