On Fri, 12 Apr 2024 22:43:15 GMT, Vladimir Kozlov <k...@openjdk.org> wrote:
> This is part of changes which try to reduce size of `nmethod` and `codeblob` > data vs code in CodeCache. > These changes reduced size of `nmethod` header from 288 to 240 bytes. From > 304 to 256 in optimized VM: > > Statistics for 1282 bytecoded nmethods for C2: > total in heap = 5560352 (100%) > header = 389728 (7.009053%) > > vs > > Statistics for 1298 bytecoded nmethods for C2: > total in heap = 5766040 (100%) > header = 332288 (5.762846%) > > > Several unneeded fields in `nmethod` and `CodeBlob` were removed. Some fields > were changed from `int` to `int16_t` with added corresponding asserts to make > sure their values are fit into 16 bits. > > I did additional cleanup after recent `CompiledMethod` removal. > > Tested tier1-7,stress,xcomp and performance testing. src/hotspot/share/code/codeBlob.cpp line 78: > 76: #ifdef ASSERT > 77: void CodeBlob::verify_parameters() { > 78: assert(is_aligned(_size, oopSize), "unaligned size"); Asserts moved to only caller. src/hotspot/share/code/codeBlob.cpp line 92: > 90: CodeBlob::CodeBlob(const char* name, CodeBlobKind kind, int size, int > header_size, int relocation_size, > 91: int content_offset, int code_offset, int > frame_complete_offset, int data_offset, > 92: int frame_size, ImmutableOopMapSet* oop_maps, bool > caller_must_gc_arguments) : This was used only by `CompiledMethod` class. src/hotspot/share/code/codeBlob.cpp line 129: > 127: } > 128: > 129: void CodeBlob::purge() { Arguments are not used. src/hotspot/share/code/codeBlob.hpp line 228: > 226: const ImmutableOopMap* oop_map_for_slot(int slot, address > return_address) const; > 227: const ImmutableOopMap* oop_map_for_return_address(address > return_address) const; > 228: virtual void preserve_callee_argument_oops(frame fr, const > RegisterMap* reg_map, OopClosure* f) = 0; This method is not empty only in `nmethod`. Converted to normal method there and added check` cb->is_nmethod()` in call sites. src/hotspot/share/code/debugInfoRec.cpp line 251: > 249: void print() { > 250: tty->print_cr("Debug Data Chunks: %d, shared %d, non-SP's elided %d", > 251: chunks_queried, chunks_shared, chunks_elided); `chunks_reshared` is not used. src/hotspot/share/code/dependencies.cpp line 391: > 389: address end = nm->dependencies_end(); > 390: guarantee(end - beg >= (ptrdiff_t) size_in_bytes(), "bad sizing"); > 391: (void)memcpy(beg, content_bytes(), size_in_bytes()); To avoid false error reported by `GCC` only during product VM build for `linux-x64`: inlined from 'void Dependencies::copy_to(nmethod*)' at src/hotspot/share/code/dependencies.cpp:391:23: src/hotspot/cpu/x86/copy_x86.hpp:110:18: error: writing 8 bytes into a region of size 0 [-Werror=stringop-overflow=] 110 | case 8: to[7] = from[7]; | ~~~~~~^~~~~~~~~ src/hotspot/share/code/nmethod.cpp line 142: > 140: uint size_gt_32k; > 141: int size_max; > 142: Diagnostic code leftover from my work on [#18554](https://github.com/openjdk/jdk/pull/18554) src/hotspot/share/code/nmethod.cpp line 1486: > 1484: } > 1485: #endif > 1486: dependencies->copy_to(this); Missed to revert back this change. src/hotspot/share/code/nmethod.hpp line 208: > 206: address _osr_entry_point; // entry point for on stack > replacement > 207: uint16_t _entry_offset; // entry point with class check > 208: uint16_t _verified_entry_offset; // entry point without class check Changed direct entry pointers (8 bytes each in 64-bit VM) to offsets (2 bytes) to `code_begin()`. src/hotspot/share/code/nmethod.hpp line 234: > 232: int _scopes_data_offset; > 233: int _handler_table_offset; > 234: int _nul_chk_table_offset; Changed data sections offsets base from `header_begin()` to `data_begin()`. Note, `ScopesPcs` and `ScopesData` data could be > 64Kb. src/hotspot/share/code/nmethod.hpp line 237: > 235: #if INCLUDE_JVMCI > 236: int _speculations_offset; > 237: int _jvmci_data_offset; "Wasted space" when Graal is not used. May be address in future changes. src/hotspot/share/code/nmethod.hpp line 274: > 272: // used by jvmti to track if an event has been posted for this nmethod. > 273: bool _load_reported; > 274: Converted to bit mask. src/hotspot/share/code/nmethod.hpp line 724: > 722: ExceptionCache* exception_cache() const { return > _exception_cache; } > 723: ExceptionCache* exception_cache_acquire() const; > 724: void set_exception_cache(ExceptionCache *ec) { _exception_cache = > ec; } Not used. src/hotspot/share/code/nmethod.hpp line 800: > 798: > 799: // Deallocate this nmethod - called by the GC > 800: void purge(bool unregister_nmethod); Only `unregister_nmethod` is used by code. src/hotspot/share/memory/heap.hpp line 42: > 40: struct Header { > 41: uint32_t _length; // the length in segments > 42: bool _used; // Used bit The `Header` size is aligned up 8 bytes. With `size_t length;` the aligned size will be 16 bytes. `HeapBlock/Header` is used by CodeCache only which has 2Gb limit. The `length` counts number of segments which smallest size (`CodeCacheSegmentSize`) is 64 bytes. 32 bits is enough to cover it. src/hotspot/share/runtime/frame.cpp line 979: > 977: if (reg_map->include_argument_oops() && _cb->is_nmethod()) { > 978: // Only nmethod preserves outgoing arguments at call. > 979: _cb->as_nmethod()->preserve_callee_argument_oops(*this, reg_map, > f); Only `nmethod` preserves arguments oops. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563303217 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563302110 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563303989 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563307999 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563310748 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563311696 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563313116 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563334063 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563317344 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563320172 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563321008 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563321437 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563321900 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563322669 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563331968 PR Review Comment: https://git.openjdk.org/jdk/pull/18768#discussion_r1563332602