From d609551899e3a123fb38855cb25b17fe5b7674e7 Mon Sep 17 00:00:00 2001 From: Evgeny Astigeevich Date: Wed, 10 Jun 2026 14:06:14 +0000 Subject: [PATCH] HCC sample_all_java_threads finishes if contention with JFR is detected --- src/hotspot/share/runtime/hotCodeSampler.cpp | 18 +++++++++++++++++- src/hotspot/share/runtime/hotCodeSampler.hpp | 13 ------------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/hotspot/share/runtime/hotCodeSampler.cpp b/src/hotspot/share/runtime/hotCodeSampler.cpp index 3e0b5022fed..0bcef40e2c7 100644 --- a/src/hotspot/share/runtime/hotCodeSampler.cpp +++ b/src/hotspot/share/runtime/hotCodeSampler.cpp @@ -29,6 +29,12 @@ #include "runtime/hotCodeSampler.hpp" #include "runtime/javaThread.inline.hpp" +#if INCLUDE_JFR +#include "jfr/utilities/jfrTryLock.hpp" + +using SuspendedThreadTaskTryLock = JfrMutexTryLock; +#endif + void ThreadSampler::sample_all_java_threads() { // Collect samples for each JavaThread for (JavaThreadIteratorWithHandle jtiwh; JavaThread *jt = jtiwh.next(); ) { @@ -39,7 +45,17 @@ void ThreadSampler::sample_all_java_threads() { } GetPCTask task(jt); - task.request_pc(); + { +#if INCLUDE_JFR + SuspendedThreadTaskTryLock try_lock(SuspendedThreadTask_lock); + if (!try_lock.acquired()) { + log_debug(hotcode)("Suspend lock held by JFR sampler; ending sampling pass, will retry next round"); + return; + } +#endif + task.run(); + } + address pc = task.pc(); if (pc == nullptr) { continue; diff --git a/src/hotspot/share/runtime/hotCodeSampler.hpp b/src/hotspot/share/runtime/hotCodeSampler.hpp index 2a96f0ded28..d61cac791e1 100644 --- a/src/hotspot/share/runtime/hotCodeSampler.hpp +++ b/src/hotspot/share/runtime/hotCodeSampler.hpp @@ -27,8 +27,6 @@ #define SHARE_RUNTIME_HOTCODESAMPLER_HPP #include "runtime/javaThread.hpp" -#include "runtime/mutex.hpp" -#include "runtime/mutexLocker.hpp" #include "runtime/suspendedThreadTask.hpp" #include "runtime/threadSMR.hpp" #include "utilities/pair.hpp" @@ -77,17 +75,6 @@ class GetPCTask : public SuspendedThreadTask { public: GetPCTask(JavaThread* thread) : SuspendedThreadTask(thread), _pc(nullptr) {} - void request_pc() { -#if INCLUDE_JFR - if (SuspendedThreadTask_lock->try_lock()) { - run(); - SuspendedThreadTask_lock->unlock(); - } -#else - run(); -#endif - } - address pc() const { return _pc; }