RFR: 8373794: Move nmethod header from CodeCache
Mikhail Ablakatov
mablakatov at openjdk.org
Thu Dec 18 11:46:01 UTC 2025
On Wed, 17 Dec 2025 17:14:29 GMT, Chris Plummer <cjplummer at openjdk.org> 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/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java line 104:
>
>> 102:
>> 103: sun.jvm.hotspot.types.Field f = type.getField("_speculations_offset", false, false);
>> 104: if (f != null) {
>
> Why is there a need for a null check here?
`_speculations_offset` is present only when JVM is compiled with JVMCI enabled, see https://github.com/openjdk/jdk/pull/28866/files/bbb3711df942ec48b0b0a6eeb287f5364afa9098#diff-ccbdfe031dfc301041cac88f76f8eb2dcacff1b9f81c50073de5c6eaeb8b8223R256 . `type.getCIntegerField("_speculations_offset")` will throw an exception if the field is missing.
Though, if the SA can't be used at all with JVMCI disabled, this check can be omitted as redundant. Please let me know if that's the case.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/28866#discussion_r2630716509
More information about the serviceability-dev
mailing list