Eclipse OpenJ9: A Java Virtual Machine for OpenJDK that's optimized for small footprint, fast start-up, and high throughput. Builds on Eclipse OMR (https://github.com/eclipse/omr) and combines with the Extensions for OpenJDK for OpenJ9 repo.
Current compressedRefs mode we allocat the ramClass out of the sub4G allocator. This allocator is highly contended as it is used for J9VMThread, J9JavaStacks and JNI memory. However, ramClass memory (in JDKs prior to JDK21) is typically the highesr user of sub 4G memory.
Our main requriement to put ramClasses in sub4G memory is to place the J9Class (ramClass header) sub4G space. This allows us to hav a pointer that is at most 32bits, with 256byte alignment, we can then have 8bits in the pointer free for other purposes (see https://github.com/eclipse-openj9/openj9/blob/master/runtime/oti/j9nonbuilder.h#L3040).
Proposal:
Given that only one part of the RamClass requires, we should look to sperate how the memory fragments are allocated for the ramClass. We could have the following categories:
1) sub4G
2) Frequently accessed
3) Infrequently accessed. //potential perform periodic disclaim
One approach could be to replicate the classMemory segment for other two categories above.
Then in the RAMClassAllocationRequest add a new entry to indicate which segment the fragment should be allocated in and make the approriate changes in the ramClass allocator.
Current compressedRefs mode we allocat the ramClass out of the sub4G allocator. This allocator is highly contended as it is used for J9VMThread, J9JavaStacks and JNI memory. However, ramClass memory (in JDKs prior to JDK21) is typically the highesr user of sub 4G memory.
Our main requriement to put ramClasses in sub4G memory is to place the J9Class (ramClass header) sub4G space. This allows us to hav a pointer that is at most 32bits, with 256byte alignment, we can then have 8bits in the pointer free for other purposes (see https://github.com/eclipse-openj9/openj9/blob/master/runtime/oti/j9nonbuilder.h#L3040).
The ramClass allocation strategy invloves: 1) Describing the allocation fragments requried 2) Allocating memory for these fragments via the RamClass allocator 3) The RamClass allocator keeps track of a free list and tries allocate memory out of the free lists first. Failing to do so it allocates a new class memory segment which makes use of the sub4G allocator.
Proposal: Given that only one part of the RamClass requires, we should look to sperate how the memory fragments are allocated for the ramClass. We could have the following categories: 1) sub4G 2) Frequently accessed 3) Infrequently accessed. //potential perform periodic disclaim
One approach could be to replicate the classMemory segment for other two categories above.
Then in the RAMClassAllocationRequest add a new entry to indicate which segment the fragment should be allocated in and make the approriate changes in the ramClass allocator.