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

Johan Sjölen jsjolen at openjdk.org
Wed Jun 5 16:20:14 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`. 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.

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

Commit messages:
 - precompiled headers are great
 - Perf Arena also
 - Perf test
 - Alter docs
 - Move the files
 - Accommodate GrowableArray
 - Spacing
 - Use the IndexedFreelistAllocator in NCSS
 - The indexed freelist allocator

Changes: https://git.openjdk.org/jdk/pull/18979/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=18979&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8333658
  Stats: 410 lines in 4 files changed: 390 ins; 3 del; 17 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