RFR: 8333658: NMT: Use an allocator with 4-byte pointers to save memory in NativeCallStackStorage [v30]

Johan Sjölen jsjolen at openjdk.org
Mon Jun 24 12:09:01 UTC 2024


> Hi,
> 
> This PR introduces a new allocator, `IndexedFreelistAllocator`. It uses a `GrowableArray` in order to have 4-byte "pointers" to its elements and also works as a freelist as unused slots form a linked list. This allocator cannot shrink its used memory. I'm always open for better names.
> 
> We then use this allocator in order to store the `NativeCallStackStorage` hash table. This saves `4 * 4099 = ~16KiB` of memory as each table element is now only 4 bytes. For each stored stack it also saves 4 bytes. The fact that the allocator cannot shrink is fine, we do not ever remove stacks from the storage.
> 
> The main point of this is to introduce a pointer-generic experimential API, so I also implemented CHeap and Arena allocators. It's currently placed in NMT, but we might want to move it into utilities. It uses a bit of template-magic, but my IDE (Emacs+clangd) was actually able to figure things out when the types didn't line up correctly etc, so it's not an enemy to IDE help.
> 
> It sounded expensive to have the GrowableArray continously realloc its underlying data array, so I did a basic test where we allocate 1 000 000 stacks and push them into NativeCallStackStorage backed by different allocators. This is available in the PR.
> 
> The results are as follows on linux-x64-slowdebug:
> 
> 
> Generate stacks... Done
> Time taken with GrowableArray: 8341.240945
> Time taken with CHeap: 12189.031318
> Time taken with Arena: 8800.703092
> Time taken with GrowableArray again: 8295.508829
> 
> 
> And on linux-x64:
> 
> 
> Time taken with GrowableArray: 8378.018135
> Time taken with CHeap: 12437.347868
> Time taken with Arena: 8758.064717
> Time taken with GrowableArray again: 8391.076291
> 
> 
> Obviously, this is a very basic benchmark, but it seems like we're faster than CHeap and Arena for this case.

Johan Sjölen has updated the pull request incrementally with two additional commits since the last revision:

 - Fix
 - Rename and use a more advanced constexpr function

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/18979/files
  - new: https://git.openjdk.org/jdk/pull/18979/files/4d631c11..478d3127

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=18979&range=29
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=18979&range=28-29

  Stats: 210 lines in 4 files changed: 106 ins; 98 del; 6 mod
  Patch: https://git.openjdk.org/jdk/pull/18979.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/18979/head:pull/18979

PR: https://git.openjdk.org/jdk/pull/18979


More information about the hotspot-dev mailing list