RFR: 8331087: Move immutable nmethod data from CodeCache

Vladimir Kozlov kvn at openjdk.org
Sat Apr 27 01:15:05 UTC 2024


On Sat, 27 Apr 2024 00:48:49 GMT, Dean Long <dlong at openjdk.org> wrote:

>> Move immutable nmethod's data from CodeCache to C heap. It includes `dependencies, nul_chk_table, handler_table, scopes_pcs, scopes_data, speculations, jvmci_data`. It amounts for about 30% (optimized VM) of space in CodeCache.
>> 
>> Use HotSpot's `os::malloc()` to allocate memory in C heap for immutable nmethod's data. Bail out compilation if allocation failed.
>> 
>> Shuffle fields order and change some fields size from 4 to 2 bytes to avoid nmethod's header size increase.
>> 
>> Tested tier1-5, stress,xcomp
>> 
>> Our performance testing does not show difference.
>> 
>> Example of updated `-XX:+PrintNMethodStatistics` output is in JBS comment.
>
> src/hotspot/share/code/nmethod.cpp line 1332:
> 
>> 1330: #if INCLUDE_JVMCI
>> 1331:     _speculations_offset     = _scopes_data_offset;
>> 1332:     _jvmci_data_offset       = _speculations_offset;
> 
> Why not use 0 for all these?

Right. Before all these offsets were assigned to _dependencies_offset which was not 0.
But now we can use 0 for all of them since "_dependencies_offset" is 0.

> src/hotspot/share/code/nmethod.cpp line 1484:
> 
>> 1482:       // Calculate positive offset as distance between the start of stubs section
>> 1483:       // (which is also the end of instructions section) and the start of the handler.
>> 1484:       CHECKED_CAST(_unwind_handler_offset, int16_t, (_stub_offset - code_offset() - offsets->value(CodeOffsets::UnwindHandler)));
> 
> Suggestion:
> 
>       int unwind_handler_offset = code_offset() + offsets->value(CodeOffsets::UnwindHandler);
>       CHECKED_CAST(_unwind_handler_offset, int16_t, _stub_offset - unwind_handler_offset);

Will do.

> src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java line 528:
> 
>> 526:   private int getScopesDataOffset()   { return (int) scopesDataOffsetField  .getValue(addr); }
>> 527:   private int getScopesPCsOffset()    { return (int) scopesPCsOffsetField   .getValue(addr); }
>> 528:   private int getDependenciesOffset() { return (int) 0; }
> 
> Suggestion:
> 
> 
> No longer used.

Will remove.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/18984#discussion_r1581667051
PR Review Comment: https://git.openjdk.org/jdk/pull/18984#discussion_r1581668080
PR Review Comment: https://git.openjdk.org/jdk/pull/18984#discussion_r1581679317


More information about the hotspot-dev mailing list