From 306201e27f01731d28c88af3836f9b98dac65a8f Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Mon, 8 Dec 2025 12:28:12 +0100 Subject: [PATCH 1/6] [PROF-13025] Fix deadlock in dd-task-scheduler --- .../controller/openjdk/events/SmapEntryFactory.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java index 68b3e063da6..790f412dbe9 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java @@ -27,6 +27,14 @@ public class SmapEntryFactory { private static final SmapEntryCache SMAP_ENTRY_CACHE = new SmapEntryCache(Duration.ofMillis(500)); static { + // Load JFR Handlers class early, if present (it has been moved and renamed in JDK23+). + // This prevents a deadlock. See PROF-13025. + try { + Class.forName("jdk.jfr.events.Handlers"); + } catch (Exception e) { + // Ignore when the class is not found or anything else goes wrong. + } + if (!JavaVirtualMachine.isJ9() && !JavaVirtualMachine.isOracleJDK8()) { SMAP_ENTRY_EVENT_TYPE = EventType.getEventType(SmapEntryEvent.class); AGGREGATED_SMAP_ENTRY_EVENT_TYPE = EventType.getEventType(AggregatedSmapEntryEvent.class); From 6bdc5372963384cf860ad4401f6abe42056d977b Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Mon, 8 Dec 2025 17:44:45 +0100 Subject: [PATCH 2/6] Load class using ClassLoader --- .../profiling/controller/openjdk/events/SmapEntryFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java index 790f412dbe9..1fe66c66240 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java @@ -30,7 +30,7 @@ public class SmapEntryFactory { // Load JFR Handlers class early, if present (it has been moved and renamed in JDK23+). // This prevents a deadlock. See PROF-13025. try { - Class.forName("jdk.jfr.events.Handlers"); + SmapEntryFactory.class.getClassLoader().loadClass("jdk.jfr.events.Handlers"); } catch (Exception e) { // Ignore when the class is not found or anything else goes wrong. } From 68f4a31fd60583e965f9fc2a2a248cda93540d80 Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Tue, 9 Dec 2025 14:12:13 +0100 Subject: [PATCH 3/6] Load Handlers class before initializing JMX --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 8 ++++++++ .../controller/openjdk/events/SmapEntryFactory.java | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 5c85b8a73ce..b99e0a3fc74 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -866,6 +866,14 @@ private static synchronized void startJmx() { if (jmxStarting.getAndSet(true)) { return; // another thread is already in startJmx } + // Load JFR Handlers class early, if present (it has been moved and renamed in JDK23+). + // This prevents a deadlock. See PROF-13025. + try { + Agent.class.getClassLoader().loadClass("jdk.jfr.events.Handlers"); + } catch (Exception e) { + // Ignore when the class is not found or anything else goes wrong. + } + if (jmxFetchEnabled) { startJmxFetch(); } diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java index 1fe66c66240..68b3e063da6 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java @@ -27,14 +27,6 @@ public class SmapEntryFactory { private static final SmapEntryCache SMAP_ENTRY_CACHE = new SmapEntryCache(Duration.ofMillis(500)); static { - // Load JFR Handlers class early, if present (it has been moved and renamed in JDK23+). - // This prevents a deadlock. See PROF-13025. - try { - SmapEntryFactory.class.getClassLoader().loadClass("jdk.jfr.events.Handlers"); - } catch (Exception e) { - // Ignore when the class is not found or anything else goes wrong. - } - if (!JavaVirtualMachine.isJ9() && !JavaVirtualMachine.isOracleJDK8()) { SMAP_ENTRY_EVENT_TYPE = EventType.getEventType(SmapEntryEvent.class); AGGREGATED_SMAP_ENTRY_EVENT_TYPE = EventType.getEventType(AggregatedSmapEntryEvent.class); From 46a956dce376ef0b2f8432275a7385bd79396d31 Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Tue, 9 Dec 2025 14:28:47 +0100 Subject: [PATCH 4/6] Use AGENT_CLASSLOADER directly --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index b99e0a3fc74..be01718f5ab 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -869,7 +869,7 @@ private static synchronized void startJmx() { // Load JFR Handlers class early, if present (it has been moved and renamed in JDK23+). // This prevents a deadlock. See PROF-13025. try { - Agent.class.getClassLoader().loadClass("jdk.jfr.events.Handlers"); + AGENT_CLASSLOADER.loadClass("jdk.jfr.events.Handlers"); } catch (Exception e) { // Ignore when the class is not found or anything else goes wrong. } From e5ac639dc015c6a1c538ead116a0168789abc0a2 Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Tue, 9 Dec 2025 21:03:05 +0100 Subject: [PATCH 5/6] Move load of Handlers into registerSmapEntryEvent() --- .../java/datadog/trace/bootstrap/Agent.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index be01718f5ab..139fec7f09c 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -866,14 +866,6 @@ private static synchronized void startJmx() { if (jmxStarting.getAndSet(true)) { return; // another thread is already in startJmx } - // Load JFR Handlers class early, if present (it has been moved and renamed in JDK23+). - // This prevents a deadlock. See PROF-13025. - try { - AGENT_CLASSLOADER.loadClass("jdk.jfr.events.Handlers"); - } catch (Exception e) { - // Ignore when the class is not found or anything else goes wrong. - } - if (jmxFetchEnabled) { startJmxFetch(); } @@ -932,6 +924,15 @@ private static synchronized void registerDeadlockDetectionEvent() { private static synchronized void registerSmapEntryEvent() { log.debug("Initializing smap entry scraping"); + + // Load JFR Handlers class early, if present (it has been moved and renamed in JDK23+). + // This prevents a deadlock. See PROF-13025. + try { + AGENT_CLASSLOADER.loadClass("jdk.jfr.events.Handlers"); + } catch (Exception e) { + // Ignore when the class is not found or anything else goes wrong. + } + try { final Class smapFactoryClass = AGENT_CLASSLOADER.loadClass( From 076a11c0835d43f8f9608eaa7c0c103b4e13c0eb Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Wed, 10 Dec 2025 16:21:57 +0100 Subject: [PATCH 6/6] Replace internal Jira ref with JBS bug issue --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 139fec7f09c..f3b5da141fc 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -926,7 +926,7 @@ private static synchronized void registerSmapEntryEvent() { log.debug("Initializing smap entry scraping"); // Load JFR Handlers class early, if present (it has been moved and renamed in JDK23+). - // This prevents a deadlock. See PROF-13025. + // This prevents a deadlock. See https://bugs.openjdk.org/browse/JDK-8371889. try { AGENT_CLASSLOADER.loadClass("jdk.jfr.events.Handlers"); } catch (Exception e) {