Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@
import org.graalvm.nativeimage.Platforms;

import com.oracle.svm.core.os.VirtualMemoryProvider;
import com.oracle.svm.core.util.BasedOnJDKFile;

import jdk.graal.compiler.core.common.NumUtil;
import jdk.jfr.internal.Options;

/**
* Holds all JFR-related options that can be set by the user. It is also used to validate and adjust
Expand All @@ -44,18 +44,32 @@
* level via {@link jdk.jfr.internal.JVM}. The option values are stored here until they are
* eventually used when first recording is created and JFR is initialized.
*/
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25-ga/src/jdk.jfr/share/classes/jdk/jfr/internal/Options.java#L48-L55")
@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25-ga/src/jdk.jfr/share/classes/jdk/jfr/internal/Options.java#L65-L69")
public class JfrOptionSet {
private static final int MEMORY_SIZE = 1;
private static final int GLOBAL_BUFFER_SIZE = 2;
private static final int GLOBAL_BUFFER_COUNT = 4;
private static final int THREAD_BUFFER_SIZE = 8;
private static final int MEMORY_SIZE_BIT = 1;
private static final int GLOBAL_BUFFER_SIZE_BIT = 2;
private static final int GLOBAL_BUFFER_COUNT_BIT = 4;
private static final int THREAD_BUFFER_SIZE_BIT = 8;

/*
* Use 2.5 MB by default (instead of 10 MB on HotSpot). We explicitly hard-code the default
* values here to avoid that those values are copied from HotSpot at build-time because
* completely different values might be set there if JFR is enabled at build-time as well.
*/
private static final long DEFAULT_GLOBAL_BUFFER_COUNT = 10;
private static final long DEFAULT_GLOBAL_BUFFER_SIZE = 256 * 1024;
private static final long DEFAULT_MEMORY_SIZE = DEFAULT_GLOBAL_BUFFER_COUNT * DEFAULT_GLOBAL_BUFFER_SIZE;
private static final long DEFAULT_THREAD_BUFFER_SIZE = 8 * 1024;
private static final int DEFAULT_STACK_DEPTH = 64;
private static final long DEFAULT_MAX_CHUNK_SIZE = 12 * 1024 * 1024;

private static final long MAX_ADJUSTED_GLOBAL_BUFFER_SIZE = 1 * 1024 * 1024;
private static final long MIN_ADJUSTED_GLOBAL_BUFFER_SIZE_CUTOFF = 512 * 1024;
private static final long MIN_GLOBAL_BUFFER_SIZE = 64 * 1024;
private static final long MIN_GLOBAL_BUFFER_COUNT = 2;
private static final long MIN_THREAD_BUFFER_SIZE = 4 * 1024;
private static final long MIN_MEMORY_SIZE = 1 * 1024 * 1024;
private static final long MIN_MEMORY_SIZE = 1024 * 1024;

public final JfrOptionLong threadBufferSize;
public final JfrOptionLong globalBufferSize;
Expand All @@ -66,12 +80,12 @@ public class JfrOptionSet {

@Platforms(Platform.HOSTED_ONLY.class)
public JfrOptionSet() {
threadBufferSize = new JfrOptionLong(Options.getThreadBufferSize());
globalBufferSize = new JfrOptionLong(Options.getGlobalBufferSize());
globalBufferCount = new JfrOptionLong(Options.getGlobalBufferCount());
memorySize = new JfrOptionLong(Options.getMemorySize());
maxChunkSize = new JfrOptionLong(Options.getMaxChunkSize());
stackDepth = new JfrOptionLong(Options.getStackDepth());
threadBufferSize = new JfrOptionLong(DEFAULT_THREAD_BUFFER_SIZE);
globalBufferSize = new JfrOptionLong(DEFAULT_GLOBAL_BUFFER_SIZE);
globalBufferCount = new JfrOptionLong(DEFAULT_GLOBAL_BUFFER_COUNT);
memorySize = new JfrOptionLong(DEFAULT_MEMORY_SIZE);
maxChunkSize = new JfrOptionLong(DEFAULT_MAX_CHUNK_SIZE);
stackDepth = new JfrOptionLong(DEFAULT_STACK_DEPTH);
}

public void validateAndAdjustMemoryOptions() {
Expand Down Expand Up @@ -120,55 +134,55 @@ private void adjustMemoryOptions() {

int setOfOptions = 0;
if (memorySize.isUserValue()) {
setOfOptions |= MEMORY_SIZE;
setOfOptions |= MEMORY_SIZE_BIT;
}
if (globalBufferSize.isUserValue()) {
setOfOptions |= GLOBAL_BUFFER_SIZE;
setOfOptions |= GLOBAL_BUFFER_SIZE_BIT;
}
if (globalBufferCount.isUserValue()) {
setOfOptions |= GLOBAL_BUFFER_COUNT;
setOfOptions |= GLOBAL_BUFFER_COUNT_BIT;
}
if (threadBufferSize.isUserValue()) {
setOfOptions |= THREAD_BUFFER_SIZE;
setOfOptions |= THREAD_BUFFER_SIZE_BIT;
}

switch (setOfOptions) {
case MEMORY_SIZE | THREAD_BUFFER_SIZE:
case MEMORY_SIZE:
case MEMORY_SIZE_BIT | THREAD_BUFFER_SIZE_BIT:
case MEMORY_SIZE_BIT:
memoryAndThreadBufferSize();
break;
case MEMORY_SIZE | GLOBAL_BUFFER_COUNT:
case MEMORY_SIZE_BIT | GLOBAL_BUFFER_COUNT_BIT:
memorySizeAndBufferCount();
break;
case MEMORY_SIZE | GLOBAL_BUFFER_SIZE | THREAD_BUFFER_SIZE:
case MEMORY_SIZE_BIT | GLOBAL_BUFFER_SIZE_BIT | THREAD_BUFFER_SIZE_BIT:
assert threadBufferSize.isUserValue();
// fall through
case MEMORY_SIZE | GLOBAL_BUFFER_SIZE:
case MEMORY_SIZE_BIT | GLOBAL_BUFFER_SIZE_BIT:
memorySizeAndGlobalBufferSize();
break;
case MEMORY_SIZE | GLOBAL_BUFFER_SIZE | GLOBAL_BUFFER_COUNT:
case MEMORY_SIZE | GLOBAL_BUFFER_SIZE | GLOBAL_BUFFER_COUNT | THREAD_BUFFER_SIZE:
case MEMORY_SIZE_BIT | GLOBAL_BUFFER_SIZE_BIT | GLOBAL_BUFFER_COUNT_BIT:
case MEMORY_SIZE_BIT | GLOBAL_BUFFER_SIZE_BIT | GLOBAL_BUFFER_COUNT_BIT | THREAD_BUFFER_SIZE_BIT:
allOptionsSet();
break;
case GLOBAL_BUFFER_SIZE | GLOBAL_BUFFER_COUNT | THREAD_BUFFER_SIZE:
case GLOBAL_BUFFER_SIZE_BIT | GLOBAL_BUFFER_COUNT_BIT | THREAD_BUFFER_SIZE_BIT:
assert globalBufferCount.isUserValue();
assert threadBufferSize.isUserValue();
// fall through
case GLOBAL_BUFFER_SIZE | GLOBAL_BUFFER_COUNT:
case GLOBAL_BUFFER_SIZE_BIT | GLOBAL_BUFFER_COUNT_BIT:
assert globalBufferSize.isUserValue();
// fall through
case GLOBAL_BUFFER_SIZE | THREAD_BUFFER_SIZE:
case GLOBAL_BUFFER_COUNT:
case GLOBAL_BUFFER_SIZE:
case GLOBAL_BUFFER_SIZE_BIT | THREAD_BUFFER_SIZE_BIT:
case GLOBAL_BUFFER_COUNT_BIT:
case GLOBAL_BUFFER_SIZE_BIT:
globalBufferSize();
break;
case MEMORY_SIZE | GLOBAL_BUFFER_COUNT | THREAD_BUFFER_SIZE:
case MEMORY_SIZE_BIT | GLOBAL_BUFFER_COUNT_BIT | THREAD_BUFFER_SIZE_BIT:
assert memorySize.isUserValue();
// fall through
case GLOBAL_BUFFER_COUNT | THREAD_BUFFER_SIZE:
case GLOBAL_BUFFER_COUNT_BIT | THREAD_BUFFER_SIZE_BIT:
assert globalBufferCount.isUserValue();
// fall through
case THREAD_BUFFER_SIZE:
case THREAD_BUFFER_SIZE_BIT:
threadBufferSize();
break;
default:
Expand Down