Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API to provide GC parameters to JFR #20842

Open
dmitripivkine opened this issue Dec 16, 2024 · 2 comments
Open

API to provide GC parameters to JFR #20842

dmitripivkine opened this issue Dec 16, 2024 · 2 comments

Comments

@dmitripivkine
Copy link
Contributor

This issue is created to be main discussion place for:

  • find equivalents in OpenJ9
  • specify unique internal OpenJ9 parameter name
  • parameters details: initial vs current, availability for current GC policy etc.
  • API implementation details

There is list of GC parameters required to be provided to JFR:

============================
GC General

Field: youngCollector
Type: GCName
Description: Young Garbage Collector: The garbage collector used for the young generation
OpenJ9 equivalent: Scavenger for Gencon, ? for other GC policies

Field: oldCollector
Type: GCName
Description: Old Garbage Collector: The garbage collector used for the old generation
OpenJ9 equivalent: ?

Field: parallelGCThreads
Type: uint
Description: Parallel GC Threads: Number of parallel threads to use for garbage collection
OpenJ9 equivalent: maximum? current?

Field: concurrentGCThreads
Type: uint
Description: Concurrent GC Threads: Number of concurrent threads to use for garbage collection
OpenJ9 equivalent: ?

Field: usesDynamicGCThreads
Type: boolean
Description: Uses Dynamic GC Threads: Whether a dynamic number of GC threads are used or not
OpenJ9 equivalent: Uses Dynamic GC Threads

Field: isExplicitGCConcurrent
Type: boolean
Description: Concurrent Explicit GC: Whether System.gc() is concurrent or not
OpenJ9 equivalent: ?

Field: isExplicitGCDisabled
Type: boolean
Description: Disabled Explicit GC: Whether System.gc() will cause a garbage collection or not
OpenJ9 equivalent: Disabled Explicit GC

Field: pauseTarget
Type: long: millis
Description: Pause Target: Target for GC pauses
OpenJ9 equivalent: ?

Field: gcTimeRatio
Type: uint
Description: GC Time Ratio: Target for runtime vs garbage collection time
OpenJ9 equivalent: ?

============================
Object Heap

Field: minSize
Type: ulong: bytes
Description: Minimum Heap Size
OpenJ9 equivalent: Initial Heap Size ?

Field: maxSize
Type: ulong: bytes
Description: Maximum Heap Size
OpenJ9 equivalent: Maximum Heap Size

Field: initialSize
Type: ulong: bytes
Description: Initial Heap Size
OpenJ9 equivalent: Initial Heap Size

Field: usesCompressedOops
Type: boolean
Description: Uses Compressed Oops: If Compressed Oops Are Used
OpenJ9 equivalent: Uses Compressed Oops

Field: compressedOopMode
Type: NarrowOopMode
Description: Compressed Oops Mode
OpenJ9 equivalent: ?

Field: objectAlignment
Type: ulong: bytes
Description: Object alignment (in bytes) on the heap
OpenJ9 equivalent: Object alignment (in bytes) on the heap

Field: heapAddressBits
Type: ubyte
Description: Heap address size (in bits)
OpenJ9 equivalent: Heap address size (in bits)

============================
Generational Collector

Field: minSize
Type: ulong: bytes
Description: Minimum Young Generation Size
OpenJ9 equivalent: Initial Nursery Size ?

Field: maxSize
Type: ulong: bytes
Description: Maximum Young Generation Size
OpenJ9 equivalent: Maximum Nursery Size

Field: newRatio
Type: uint
Description: New Ratio: The size of the young generation relative to the tenured generation
OpenJ9 equivalent: The size of the Nursery relative to the size of the Tenure ?

============================
TLABs

Field: usesTLABs
Type: boolean
Description: TLABs Used: If Thread Local Allocation Buffers are in use
OpenJ9 equivalent: TLHs Used: If Thread Local Buffers are in use

Field: minTLABSize
Type: ulong: bytes
Description: Minimum TLAB Size
OpenJ9 equivalent: Minimum TLH size

Field: tlabRefillWasteLimit
Type: ulong: bytes
Description: TLAB Refill Waste Limit
OpenJ9 equivalent: ?

============================
Tenuring Details

Field: maxTenuringThreshold
Type: ubyte
Description: Maximum Tenuring Threshold: Upper limit for the age of how old objects to keep in the survivor area
OpenJ9 equivalent: Maximum Tenuring Threshold

Field: initialTenuringThreshold
Type: ubyte
Description: Initial Tenuring Threshold: Initial age limit for how old objects to keep in the survivor area
OpenJ9 equivalent: Initial Tenuring Threshold ?

@dmitripivkine
Copy link
Contributor Author

@TobiAjila @amicic

@dmitripivkine
Copy link
Contributor Author

Implementation details:

Currently I see two reasonable ways to implement this feature:

We do have API visible externally to GC returns initial configuration details:

UDATA
j9gc_modron_getConfigurationValueForKey(J9JavaVM *javaVM, UDATA key, void *value)

This API can be stretched for JFR support.
Pros: there is single function to all parameters, list can be expanded by adding new keys.
Cons: Strech of current use, unification of outputs for all parameters (please note despite output parameter value has void * type - I guess was designed in expectation of flexible output - current practical use is limited to return UDATA only. I am not sure do we want to change this or unify output for all parameters - for example to return predefined number instead of string)

An alternative common used way is creation if individual external GC function for each of parameters.
Pros: Unlimited flexibility
Cons: Potentially large number of functions needs to be added to the table.

@tajila tajila added the jfr label Dec 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants