RFR: 8288477: nmethod header size reduction
Boris Ulasevich
bulasevich at openjdk.org
Thu Jul 7 10:31:12 UTC 2022
Each compiled method contains an nmethod header. In trivial case, the header takes up half the method payload: ~350 bytes. Over time, the header gets bigger. With this change, I suggest sorting the header data fields from largest to smallest to minimize header paddings, and using one byte for the CompilerType and CompLevel values.
Cleanup work: apply CompLevel type where applicable.
The change tested with jtreg tier1-3, :hotspot_compiler :hotspot_gc :hotspot_serviceability :hotspot_runtime
Renaissance benchmarks shows no performance regressions on x86 and aarch.
BEFORE:
(gdb) ptype /o CodeBlob
/* offset | size */ type = class CodeBlob {
/* 8 | 4 */ const CompilerType _type; <<<<
/* 12 | 4 */ int _size;
/* 16 | 4 */ int _header_size;
/* 20 | 4 */ int _frame_complete_offset;
/* 24 | 4 */ int _data_offset;
/* 28 | 4 */ int _frame_size;
/* 32 | 8 */ address _code_begin;
/* 40 | 8 */ address _code_end;
/* 48 | 8 */ address _content_begin;
/* 56 | 8 */ address _data_end;
/* 64 | 8 */ address _relocation_begin;
/* 72 | 8 */ address _relocation_end;
/* 80 | 8 */ ImmutableOopMapSet *_oop_maps;
/* 88 | 1 */ bool _caller_must_gc_arguments;
/* 89 | 1 */ bool _is_compiled;
/* XXX 6-byte hole */
/* 96 | 8 */ const char *_name;
/* 104 | 8 */ class AsmRemarks {
/* 104 | 8 */ AsmRemarkCollection *_remarks;
} _asm_remarks;
/* 112 | 8 */ class DbgStrings {
/* 112 | 8 */ DbgStringCollection *_strings;
} _dbg_strings;
/* total size (bytes): 120 */
}
AFTER:
(gdb) ptype /o CodeBlob
/* offset | size */ type = class CodeBlob {
protected:
/* 8 | 8 */ address _code_begin;
/* 16 | 8 */ address _code_end;
/* 24 | 8 */ address _content_begin;
/* 32 | 8 */ address _data_end;
/* 40 | 8 */ address _relocation_begin;
/* 48 | 8 */ address _relocation_end;
/* 56 | 8 */ ImmutableOopMapSet *_oop_maps;
/* 64 | 8 */ const char *_name;
/* 72 | 4 */ int _size;
/* 76 | 4 */ int _header_size;
/* 80 | 4 */ int _frame_complete_offset;
/* 84 | 4 */ int _data_offset;
/* 88 | 4 */ int _frame_size;
/* 92 | 1 */ bool _caller_must_gc_arguments;
/* 93 | 1 */ bool _is_compiled;
/* 94 | 1 */ const CompilerType _type; <<<<
/* XXX 1-byte hole */
/* 96 | 8 */ class AsmRemarks {
/* 96 | 8 */ AsmRemarkCollection *_remarks;
} _asm_remarks;
/* 104 | 8 */ class DbgStrings {
/* 104 | 8 */ DbgStringCollection *_strings;
} _dbg_strings;
/* total size (bytes): 112 */
}
BEFORE:
(gdb) ptype /o nmethod
/* offset | size */ type = class nmethod : public CompiledMethod {
private:
/* 208 | 4 */ int _entry_bci;
/* XXX 4-byte hole */
/* 216 | 8 */ uint64_t _gc_epoch;
/* 224 | 8 */ nmethod *_osr_link;
/* 232 | 8 */ nmethod::oops_do_mark_link * volatile _oops_do_mark_link;
/* 240 | 8 */ address _entry_point;
/* 248 | 8 */ address _verified_entry_point;
/* 256 | 8 */ address _osr_entry_point;
/* 264 | 4 */ int _exception_offset;
/* 268 | 4 */ int _unwind_handler_offset;
/* 272 | 4 */ int _consts_offset;
/* 276 | 4 */ int _stub_offset;
/* 280 | 4 */ int _oops_offset;
/* 284 | 4 */ int _metadata_offset;
/* 288 | 4 */ int _scopes_data_offset;
/* 292 | 4 */ int _scopes_pcs_offset;
/* 296 | 4 */ int _dependencies_offset;
/* 300 | 4 */ int _handler_table_offset;
/* 304 | 4 */ int _nul_chk_table_offset;
/* 308 | 4 */ int _speculations_offset;
/* 312 | 4 */ int _jvmci_data_offset;
/* 316 | 4 */ int _nmethod_end_offset;
/* 320 | 4 */ int _orig_pc_offset;
/* 324 | 4 */ int _compile_id;
/* 328 | 4 */ int _comp_level; <<<<
/* 332 | 1 */ bool _has_flushed_dependencies;
/* 333 | 1 */ bool _unload_reported;
/* 334 | 1 */ bool _load_reported;
/* 335 | 1 */ volatile signed char _state;
/* 336 | 1 */ bool _oops_are_stale;
/* XXX 3-byte hole */
/* 340 | 4 */ RTMState _rtm_state;
/* 344 | 4 */ volatile jint _lock_count;
/* XXX 4-byte hole */
/* 352 | 8 */ volatile int64_t _stack_traversal_mark;
/* 360 | 4 */ int _hotness_counter;
/* 364 | 1 */ volatile uint8_t _is_unloading_state;
/* XXX 3-byte hole */
/* 368 | 4 */ ByteSize _native_receiver_sp_offset;
/* 372 | 4 */ ByteSize _native_basic_lock_sp_offset;
/* total size (bytes): 376 */
}
AFTER:
(gdb) ptype /o nmethod
/* offset | size */ type = class nmethod : public CompiledMethod {
/* 200 | 8 */ uint64_t _gc_epoch;
/* 208 | 8 */ volatile int64_t _stack_traversal_mark;
/* 216 | 8 */ nmethod *_osr_link;
/* 224 | 8 */ nmethod::oops_do_mark_link * volatile _oops_do_mark_link;
/* 232 | 8 */ address _entry_point;
/* 240 | 8 */ address _verified_entry_point;
/* 248 | 8 */ address _osr_entry_point;
/* 256 | 4 */ int _entry_bci;
/* 260 | 4 */ int _exception_offset;
/* 264 | 4 */ int _unwind_handler_offset;
/* 268 | 4 */ int _consts_offset;
/* 272 | 4 */ int _stub_offset;
/* 276 | 4 */ int _oops_offset;
/* 280 | 4 */ int _metadata_offset;
/* 284 | 4 */ int _scopes_data_offset;
/* 288 | 4 */ int _scopes_pcs_offset;
/* 292 | 4 */ int _dependencies_offset;
/* 296 | 4 */ int _handler_table_offset;
/* 300 | 4 */ int _nul_chk_table_offset;
/* 304 | 4 */ int _speculations_offset;
/* 308 | 4 */ int _jvmci_data_offset;
/* 312 | 4 */ int _nmethod_end_offset;
/* 316 | 4 */ int _orig_pc_offset;
/* 320 | 4 */ int _compile_id;
/* 324 | 4 */ RTMState _rtm_state;
/* 328 | 4 */ volatile jint _lock_count;
/* 332 | 4 */ int _hotness_counter;
/* 336 | 4 */ ByteSize _native_receiver_sp_offset;
/* 340 | 4 */ ByteSize _native_basic_lock_sp_offset;
/* 344 | 1 */ CompLevel _comp_level; <<<<
/* 345 | 1 */ volatile uint8_t _is_unloading_state;
/* 346 | 1 */ bool _has_flushed_dependencies;
/* 347 | 1 */ bool _unload_reported;
/* 348 | 1 */ bool _load_reported;
/* 349 | 1 */ volatile signed char _state;
/* 350 | 1 */ bool _oops_are_stale;
/* total size (bytes): 352 */
}
-------------
Commit messages:
- add a comment
- - reorder fields in CodeBlob and nmethod stucts to avoid internal alignment
Changes: https://git.openjdk.org/jdk/pull/9165/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=9165&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8288477
Stats: 200 lines in 23 files changed: 61 ins; 55 del; 84 mod
Patch: https://git.openjdk.org/jdk/pull/9165.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/9165/head:pull/9165
PR: https://git.openjdk.org/jdk/pull/9165
More information about the hotspot-dev
mailing list