From db68996c86e4a8fea505e2bdf27947f93f61c58d Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Wed, 3 Jun 2026 08:54:17 -0400 Subject: [PATCH 01/14] Added force jmethodID experimental feature support --- .../profiling/controller/ProfilerFlareReporter.java | 7 +++++++ .../datadog/profiling/ddprof/DatadogProfilerConfig.java | 9 +++++++++ .../java/datadog/trace/api/config/ProfilingConfig.java | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java index 95f538a715c..d6863317ca4 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java @@ -352,6 +352,13 @@ private String getProfilerConfig() { ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER, ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER_DEFAULT), ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER_DEFAULT); + appendConfig( + sb, + "DDProf force preload jmethodIDs", + configProvider.getBoolean( + ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID, + ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT), + ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT); sb.append("\n=== DDProf Allocation Profiling ===\n"); appendConfig( sb, diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java index 60c0d5c2e60..f400a06f901 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java @@ -15,6 +15,8 @@ import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_CPU_INTERVAL_DEFAULT; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK_DEFAULT; +import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID; +import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_LIBPATH; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_LINE_NUMBERS; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_LINE_NUMBERS_DEFAULT; @@ -439,6 +441,13 @@ public static long getLong(ConfigProvider configProvider, String key) { return configProvider.getLong(key, configProvider.getLong(normalizeKey(key), -1)); } + public static boolean forceJMethodID(ConfigProvider configProvider) { + return getBoolean( + configProvider, + PROFILING_DATADOG_PROFILER_FORCE_JMETHODID, + PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT); + } + private static String normalizeKey(String key) { return key.replace(".ddprof.", ".async."); } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java index 4076f4aae30..d356b0eb9aa 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java @@ -34,6 +34,12 @@ public final class ProfilingConfig { public static final String PROFILING_UPLOAD_TIMEOUT = "profiling.upload.timeout"; public static final int PROFILING_UPLOAD_TIMEOUT_DEFAULT = 30; + // Experimental feature for reducing jmethoidID allocations + public static final String PROFILING_DATADOG_PROFILER_FORCE_JMETHODID = + "profiling.experimental.ddprof.force_jmethodID"; + // The feature is off by default + public static final boolean PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT = true; + /** * @deprecated Use {@link #PROFILING_DEBUG_UPLOAD_COMPRESSION} instead. This will be removed in a * future release. From a7c9f1b53d0123bd8396fd12b5d6bfb15f4998a6 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Wed, 3 Jun 2026 09:09:44 -0400 Subject: [PATCH 02/14] Fix --- .../profiling/controller/ProfilerFlareReporter.java | 7 +++++++ .../com/datadog/profiling/ddprof/DatadogProfiler.java | 7 +++++++ .../datadog/profiling/ddprof/DatadogProfilerConfig.java | 9 +++++++++ .../java/datadog/trace/api/config/ProfilingConfig.java | 6 ++++++ 4 files changed, 29 insertions(+) diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java index 95f538a715c..d6863317ca4 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java @@ -352,6 +352,13 @@ private String getProfilerConfig() { ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER, ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER_DEFAULT), ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER_DEFAULT); + appendConfig( + sb, + "DDProf force preload jmethodIDs", + configProvider.getBoolean( + ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID, + ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT), + ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT); sb.append("\n=== DDProf Allocation Profiling ===\n"); appendConfig( sb, diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java index 9aedde9e49f..5f486cdbfb2 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java @@ -1,5 +1,6 @@ package com.datadog.profiling.ddprof; +import static com.datadog.profiling.ddprof.DatadogProfilerConfig.forceJMethodID; import static com.datadog.profiling.ddprof.DatadogProfilerConfig.getAllocationInterval; import static com.datadog.profiling.ddprof.DatadogProfilerConfig.getCStack; import static com.datadog.profiling.ddprof.DatadogProfilerConfig.getContextAttributes; @@ -276,6 +277,12 @@ String cmdStartProfiling(Path file) throws IllegalStateException { if (omitLineNumbers(configProvider)) { cmd.append(",linenumbers=f"); } + + // Default is true + if (!forceJMethodID(configProvider)) { + cmd.append(",force_jmethodID=false"); + } + if (profilingModes.contains(CPU)) { // cpu profiling is enabled. String schedulingEvent = getSchedulingEvent(configProvider); diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java index 60c0d5c2e60..f400a06f901 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java @@ -15,6 +15,8 @@ import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_CPU_INTERVAL_DEFAULT; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK_DEFAULT; +import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID; +import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_LIBPATH; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_LINE_NUMBERS; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_LINE_NUMBERS_DEFAULT; @@ -439,6 +441,13 @@ public static long getLong(ConfigProvider configProvider, String key) { return configProvider.getLong(key, configProvider.getLong(normalizeKey(key), -1)); } + public static boolean forceJMethodID(ConfigProvider configProvider) { + return getBoolean( + configProvider, + PROFILING_DATADOG_PROFILER_FORCE_JMETHODID, + PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT); + } + private static String normalizeKey(String key) { return key.replace(".ddprof.", ".async."); } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java index 4076f4aae30..d356b0eb9aa 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java @@ -34,6 +34,12 @@ public final class ProfilingConfig { public static final String PROFILING_UPLOAD_TIMEOUT = "profiling.upload.timeout"; public static final int PROFILING_UPLOAD_TIMEOUT_DEFAULT = 30; + // Experimental feature for reducing jmethoidID allocations + public static final String PROFILING_DATADOG_PROFILER_FORCE_JMETHODID = + "profiling.experimental.ddprof.force_jmethodID"; + // The feature is off by default + public static final boolean PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT = true; + /** * @deprecated Use {@link #PROFILING_DEBUG_UPLOAD_COMPRESSION} instead. This will be removed in a * future release. From ce4ae9b332ceaa983478e1f1891a35087b6e55cf Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Wed, 3 Jun 2026 10:23:24 -0400 Subject: [PATCH 03/14] Add DD_PROFILING_EXPERIMENTAL_DDPROF_FORCE_JMETHODID to supported-configurations.json --- metadata/supported-configurations.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index b70f1b960d3..813d3ad2170 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -2761,6 +2761,14 @@ "aliases": [] } ], + "DD_PROFILING_EXPERIMENTAL_DDPROF_FORCE_JMETHODID": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], "DD_PROFILING_AUXILIARY": [ { "version": "A", From 0c12bd9e42c7715ad2c8dd69bac26f35f6444b42 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Wed, 3 Jun 2026 11:08:13 -0400 Subject: [PATCH 04/14] Fix --- metadata/supported-configurations.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index 813d3ad2170..0e67df162f2 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -2761,14 +2761,6 @@ "aliases": [] } ], - "DD_PROFILING_EXPERIMENTAL_DDPROF_FORCE_JMETHODID": [ - { - "version": "A", - "type": "boolean", - "default": "true", - "aliases": [] - } - ], "DD_PROFILING_AUXILIARY": [ { "version": "A", @@ -3417,6 +3409,14 @@ "aliases": [] } ], + "DD_PROFILING_EXPERIMENTAL_DDPROF_FORCE_JMETHODID": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], "DD_PROFILING_URL": [ { "version": "A", From 40a9a29b6158c4bafef9bec0966d365d142d0f9d Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Mon, 6 Jul 2026 21:47:51 +0200 Subject: [PATCH 05/14] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../main/java/datadog/trace/api/config/ProfilingConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java index d356b0eb9aa..8a1c86e2a31 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java @@ -34,10 +34,10 @@ public final class ProfilingConfig { public static final String PROFILING_UPLOAD_TIMEOUT = "profiling.upload.timeout"; public static final int PROFILING_UPLOAD_TIMEOUT_DEFAULT = 30; - // Experimental feature for reducing jmethoidID allocations + // When set to false, ddprof skips preloading jmethodIDs for eligible system classes to reduce + // native memory usage. Default is true to preserve current behavior (force preloading). public static final String PROFILING_DATADOG_PROFILER_FORCE_JMETHODID = "profiling.experimental.ddprof.force_jmethodID"; - // The feature is off by default public static final boolean PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT = true; /** From 792514bc22b392ae8f65ad12ee5b4ff7ca62351f Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Mon, 6 Jul 2026 16:31:07 -0400 Subject: [PATCH 06/14] AI reviews --- .../profiling/ddprof/DatadogProfiler.java | 2 +- .../profiling/ddprof/DatadogProfilerTest.java | 16 ++++++++++++++++ metadata/supported-configurations.json | 16 ++++++++-------- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java index 01c7fa86c22..de23d38668b 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java @@ -422,7 +422,7 @@ String cmdStartProfiling(Path file) throws IllegalStateException { // Default is true if (!forceJMethodID(configProvider)) { - cmd.append(",force_jmethodID=false"); + cmd.append(",fjmethodid=false"); } if (profilingModes.contains(CPU)) { diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java index 2be7d129e68..ed1a7d0d33a 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java @@ -108,6 +108,22 @@ private static Stream profilingModes() { Arguments.of((x & 0x1000) != 0, (x & 0x100) != 0, (x & 0x10) != 0, (x & 0x1) != 0)); } + @Test + void testStartCmdForceJMethodIDDisabled() throws Exception { + assertDoesNotThrow( + () -> DdprofLibraryLoader.jvmAccess().getReasonNotLoaded(), "Profiler not available"); + + Properties props = new Properties(); + props.put(ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID, "false"); + DatadogProfiler profiler = + DatadogProfiler.newInstance(ConfigProvider.withPropertiesOverride(props)); + + Path targetFile = Paths.get("/tmp/target.jfr"); + String cmd = profiler.cmdStartProfiling(targetFile); + + assertTrue(cmd.contains(",fjmethodid=false"), cmd); + } + @ParameterizedTest @MethodSource("wallContextFilterModes") void testWallContextFilter(boolean tracingEnabled, boolean contextFilterEnabled) diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index d2148d3ba37..d92d2443859 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -3145,6 +3145,14 @@ "aliases": [] } ], + "DD_PROFILING_EXPERIMENTAL_DDPROF_FORCE_JMETHODID": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], "DD_PROFILING_EXPERIMENTAL_DDPROF_SCHEDULING_EVENT": [ { "version": "A", @@ -3417,14 +3425,6 @@ "aliases": [] } ], - "DD_PROFILING_EXPERIMENTAL_DDPROF_FORCE_JMETHODID": [ - { - "version": "A", - "type": "boolean", - "default": "true", - "aliases": [] - } - ], "DD_PROFILING_URL": [ { "version": "A", From 0089bd1a664813ee8b73bc0ba4e9a7762bfea7d0 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Mon, 6 Jul 2026 22:39:52 +0200 Subject: [PATCH 07/14] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../com/datadog/profiling/controller/ProfilerFlareReporter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java index d6863317ca4..f6a2e4251aa 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java @@ -354,7 +354,7 @@ private String getProfilerConfig() { ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER_DEFAULT); appendConfig( sb, - "DDProf force preload jmethodIDs", + "DDProf Force Preload jmethodIDs", configProvider.getBoolean( ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID, ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT), From d201f80238807de43c76d4e4474317415800741e Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Mon, 6 Jul 2026 16:45:56 -0400 Subject: [PATCH 08/14] AI review comment --- .../src/main/java/datadog/trace/api/config/ProfilingConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java index 8a1c86e2a31..61dc3bf81a2 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java @@ -37,7 +37,7 @@ public final class ProfilingConfig { // When set to false, ddprof skips preloading jmethodIDs for eligible system classes to reduce // native memory usage. Default is true to preserve current behavior (force preloading). public static final String PROFILING_DATADOG_PROFILER_FORCE_JMETHODID = - "profiling.experimental.ddprof.force_jmethodID"; + "profiling.experimental.ddprof.force_jmethodid"; public static final boolean PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT = true; /** From 7b919f58ac2368882dc32648a8a52db7e94a3220 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Mon, 6 Jul 2026 16:57:26 -0400 Subject: [PATCH 09/14] Fix config-inversion-linter failure --- metadata/supported-configurations.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index d92d2443859..f37540277fa 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -3121,6 +3121,14 @@ "aliases": [] } ], + "DD_PROFILING_EXPERIMENTAL_ASYNC_FORCE_JMETHODID": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], "DD_PROFILING_EXPERIMENTAL_ASYNC_SCHEDULING_EVENT": [ { "version": "A", @@ -3145,14 +3153,6 @@ "aliases": [] } ], - "DD_PROFILING_EXPERIMENTAL_DDPROF_FORCE_JMETHODID": [ - { - "version": "A", - "type": "boolean", - "default": "true", - "aliases": [] - } - ], "DD_PROFILING_EXPERIMENTAL_DDPROF_SCHEDULING_EVENT": [ { "version": "A", From 94654d016e1429ce9168e389f2671b0256f31da5 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Mon, 6 Jul 2026 17:18:52 -0400 Subject: [PATCH 10/14] Fix checkConfigStrings --- metadata/supported-configurations.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index f37540277fa..9c9f3b8fc51 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -3153,6 +3153,14 @@ "aliases": [] } ], + "DD_PROFILING_EXPERIMENTAL_DDPROF_FORCE_JMETHODID": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], "DD_PROFILING_EXPERIMENTAL_DDPROF_SCHEDULING_EVENT": [ { "version": "A", From d66316b486cb13f20a141119cce7a13fdc951b45 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Tue, 7 Jul 2026 09:33:51 -0400 Subject: [PATCH 11/14] Addressed review comments --- .../profiling/controller/ProfilerFlareReporter.java | 6 +++--- .../com/datadog/profiling/ddprof/DatadogProfiler.java | 4 ++-- .../profiling/ddprof/DatadogProfilerConfig.java | 10 +++++----- .../datadog/profiling/ddprof/DatadogProfilerTest.java | 4 ++-- .../java/datadog/trace/api/config/ProfilingConfig.java | 6 +++--- metadata/supported-configurations.json | 8 ++++---- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java index f6a2e4251aa..5bbc9997f71 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerFlareReporter.java @@ -356,9 +356,9 @@ private String getProfilerConfig() { sb, "DDProf Force Preload jmethodIDs", configProvider.getBoolean( - ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID, - ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT), - ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT); + ProfilingConfig.PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED, + ProfilingConfig.PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED_DEFAULT), + ProfilingConfig.PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED_DEFAULT); sb.append("\n=== DDProf Allocation Profiling ===\n"); appendConfig( sb, diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java index de23d38668b..201a9a7d259 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java @@ -1,6 +1,6 @@ package com.datadog.profiling.ddprof; -import static com.datadog.profiling.ddprof.DatadogProfilerConfig.forceJMethodID; +import static com.datadog.profiling.ddprof.DatadogProfilerConfig.enableJMethodIDOptim; import static com.datadog.profiling.ddprof.DatadogProfilerConfig.getAllocationInterval; import static com.datadog.profiling.ddprof.DatadogProfilerConfig.getCStack; import static com.datadog.profiling.ddprof.DatadogProfilerConfig.getContextAttributes; @@ -421,7 +421,7 @@ String cmdStartProfiling(Path file) throws IllegalStateException { } // Default is true - if (!forceJMethodID(configProvider)) { + if (enableJMethodIDOptim(configProvider)) { cmd.append(",fjmethodid=false"); } diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java index f400a06f901..8582e27c853 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java @@ -15,8 +15,8 @@ import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_CPU_INTERVAL_DEFAULT; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK_DEFAULT; -import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID; -import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT; +import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED; +import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED_DEFAULT; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_LIBPATH; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_LINE_NUMBERS; import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_LINE_NUMBERS_DEFAULT; @@ -441,11 +441,11 @@ public static long getLong(ConfigProvider configProvider, String key) { return configProvider.getLong(key, configProvider.getLong(normalizeKey(key), -1)); } - public static boolean forceJMethodID(ConfigProvider configProvider) { + public static boolean enableJMethodIDOptim(ConfigProvider configProvider) { return getBoolean( configProvider, - PROFILING_DATADOG_PROFILER_FORCE_JMETHODID, - PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT); + PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED, + PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED_DEFAULT); } private static String normalizeKey(String key) { diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java index ed1a7d0d33a..5edc02dad66 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java @@ -109,12 +109,12 @@ private static Stream profilingModes() { } @Test - void testStartCmdForceJMethodIDDisabled() throws Exception { + void testStartCmdEnableJMethodIDOptim() throws Exception { assertDoesNotThrow( () -> DdprofLibraryLoader.jvmAccess().getReasonNotLoaded(), "Profiler not available"); Properties props = new Properties(); - props.put(ProfilingConfig.PROFILING_DATADOG_PROFILER_FORCE_JMETHODID, "false"); + props.put(ProfilingConfig.PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED, "true"); DatadogProfiler profiler = DatadogProfiler.newInstance(ConfigProvider.withPropertiesOverride(props)); diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java index 61dc3bf81a2..6d60ab686a7 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java @@ -36,9 +36,9 @@ public final class ProfilingConfig { // When set to false, ddprof skips preloading jmethodIDs for eligible system classes to reduce // native memory usage. Default is true to preserve current behavior (force preloading). - public static final String PROFILING_DATADOG_PROFILER_FORCE_JMETHODID = - "profiling.experimental.ddprof.force_jmethodid"; - public static final boolean PROFILING_DATADOG_PROFILER_FORCE_JMETHODID_DEFAULT = true; + public static final String PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED = + "profiling.experimental.ddprof.jmethodid_optim.enabled"; + public static final boolean PROFILING_DATADOG_PROFILER_JMETHODID_OPTIM_ENABLED_DEFAULT = false; /** * @deprecated Use {@link #PROFILING_DEBUG_UPLOAD_COMPRESSION} instead. This will be removed in a diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index 9c9f3b8fc51..278abfc948c 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -3121,11 +3121,11 @@ "aliases": [] } ], - "DD_PROFILING_EXPERIMENTAL_ASYNC_FORCE_JMETHODID": [ + "DD_PROFILING_EXPERIMENTAL_ASYNC_ENABLE_JMETHODID_OPTIM": [ { "version": "A", "type": "boolean", - "default": "true", + "default": "false", "aliases": [] } ], @@ -3153,11 +3153,11 @@ "aliases": [] } ], - "DD_PROFILING_EXPERIMENTAL_DDPROF_FORCE_JMETHODID": [ + "DD_PROFILING_EXPERIMENTAL_DDPROF_ENABLE_JMETHODID_OPTIM": [ { "version": "A", "type": "boolean", - "default": "true", + "default": "false", "aliases": [] } ], From 0bec0ad7e48b8cf48ea9bc17087f85837f592fd1 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Tue, 7 Jul 2026 09:57:39 -0400 Subject: [PATCH 12/14] Create tmp file for recording --- .../com/datadog/profiling/ddprof/DatadogProfilerTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java index 5edc02dad66..314fe58e725 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java @@ -16,6 +16,7 @@ import datadog.trace.api.profiling.ProfilingScope; import datadog.trace.api.profiling.RecordingData; import datadog.trace.bootstrap.config.provider.ConfigProvider; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; @@ -118,7 +119,8 @@ void testStartCmdEnableJMethodIDOptim() throws Exception { DatadogProfiler profiler = DatadogProfiler.newInstance(ConfigProvider.withPropertiesOverride(props)); - Path targetFile = Paths.get("/tmp/target.jfr"); + Path dir = Path.of("/tmp"); + Path targetFile = Files.createTempFile(dir, "target_", ".jfr"); String cmd = profiler.cmdStartProfiling(targetFile); assertTrue(cmd.contains(",fjmethodid=false"), cmd); From dc47563f5d14a9de83ad4e184c0d6abb5b7b50d3 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Tue, 7 Jul 2026 10:38:06 -0400 Subject: [PATCH 13/14] Fix --- metadata/supported-configurations.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index 278abfc948c..733f3736cbb 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -3121,7 +3121,7 @@ "aliases": [] } ], - "DD_PROFILING_EXPERIMENTAL_ASYNC_ENABLE_JMETHODID_OPTIM": [ + "DD_PROFILING_EXPERIMENTAL_ASYNC_JMETHODID_OPTIM_ENABLED": [ { "version": "A", "type": "boolean", @@ -3153,7 +3153,7 @@ "aliases": [] } ], - "DD_PROFILING_EXPERIMENTAL_DDPROF_ENABLE_JMETHODID_OPTIM": [ + "DD_PROFILING_EXPERIMENTAL_DDPROF_JMETHODID_OPTIM_ENABLED": [ { "version": "A", "type": "boolean", From b61ddef24e86cfea78714fcc5cb7abb21fc252e3 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Tue, 7 Jul 2026 11:24:33 -0400 Subject: [PATCH 14/14] Replacing Path.of() due to language level --- .../java/com/datadog/profiling/ddprof/DatadogProfilerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java index 314fe58e725..ed07d0c09c9 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java @@ -119,7 +119,7 @@ void testStartCmdEnableJMethodIDOptim() throws Exception { DatadogProfiler profiler = DatadogProfiler.newInstance(ConfigProvider.withPropertiesOverride(props)); - Path dir = Path.of("/tmp"); + Path dir = Paths.get("/tmp"); Path targetFile = Files.createTempFile(dir, "target_", ".jfr"); String cmd = profiler.cmdStartProfiling(targetFile);