RFR: 8312132: Add tracking of multiple address spaces in NMT [v41]

Johan Sjölen jsjolen at openjdk.org
Fri Apr 19 12:56:31 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 refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR. The pull request contains one new commit since the last revision:

  First go at a recur_count + test

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/18289/files
  - new: https://git.openjdk.org/jdk/pull/18289/files/6e1b4915..4b51328c

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=18289&range=40
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=18289&range=39-40

  Stats: 19 lines in 2 files changed: 1 ins; 18 del; 0 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