On Wed, 17 Dec 2025 11:34:46 GMT, Mikhail Ablakatov <[email protected]> wrote:
> nmethod objects in the CodeCache have the following layout: > > > | CodeBlob header | NMethod header | Constants | MainCode | StubCode | > Data/oops | > > > Although mutable and immutable metadata have already been moved out of the > code cache by JDK-8343789 and JDK-8331087 respectively, the embedded > `nmethod` header fields still occupy ~160 B (with the `CodeBlob` header > adding another 64 B). In JDK25 the total header footprint is 224 B. This > space is reserved inside executable memory, which decreases overall > executable code density. > > This patch relocates the `nmethod` header to a C-heap-allocated structure and > keeps only 8-byte pointer to that header in the CodeCache. The resulting > layout is: > > > | CodeBlob header | Ptr to NMethodHeader | Constants | MainCode | StubCode | > Data/oops | > > > This change reduces the size of the CodeCache-resident header from 224 B to > 72 B (64 B `CodeBlob` header + 8 B pointer), achieving roughly a **3x > reduction** in header footprint. > > This change follows the direction established by JDK-7072317, JDK-8331087 and > JDK-8343789. > > ## Testing > > The patch has passed `tier1-3` and `hotspot_all` tests on AArch64 and x86_64. src/hotspot/share/code/nmethod.cpp line 1233: > 1231: _hdr->_has_flushed_dependencies = 0; > 1232: _hdr->_is_unlinked = 0; > 1233: _hdr->_load_reported = 0; // jvmti state Again, give `NMethodHeader` its own copy and initialize logic. src/hotspot/share/code/nmethod.cpp line 1460: > 1458: _hdr->_unwind_handler_offset = nm._hdr->_unwind_handler_offset; > 1459: _hdr->_num_stack_arg_slots = nm._hdr->_num_stack_arg_slots; > 1460: _hdr->_oops_size = nm._hdr->_oops_size; This stuff belongs in class `NMethodHeader` ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/28866#discussion_r2731301721 PR Review Comment: https://git.openjdk.org/jdk/pull/28866#discussion_r2731303752
