diff --git a/src/hotspot/share/jfr/recorder/service/jfrRecorderThread.cpp b/src/hotspot/share/jfr/recorder/service/jfrRecorderThread.cpp index 71b7014e6ec13..aa594ea6d1ffe 100644 --- a/src/hotspot/share/jfr/recorder/service/jfrRecorderThread.cpp +++ b/src/hotspot/share/jfr/recorder/service/jfrRecorderThread.cpp @@ -36,14 +36,6 @@ #include "utilities/preserveException.hpp" #include "utilities/macros.hpp" -class JfrRecorderThread : public JavaThread { - public: - JfrRecorderThread(ThreadFunction entry_point) : JavaThread(entry_point) {} - virtual ~JfrRecorderThread() {} - - virtual bool is_JfrRecorder_thread() const { return true; } -}; - static Thread* start_thread(instanceHandle thread_oop, ThreadFunction proc, TRAPS) { assert(thread_oop.not_null(), "invariant"); assert(proc != nullptr, "invariant"); diff --git a/src/hotspot/share/jfr/recorder/service/jfrRecorderThread.hpp b/src/hotspot/share/jfr/recorder/service/jfrRecorderThread.hpp index df8b1f55a4e9f..34993e4e6cfee 100644 --- a/src/hotspot/share/jfr/recorder/service/jfrRecorderThread.hpp +++ b/src/hotspot/share/jfr/recorder/service/jfrRecorderThread.hpp @@ -26,9 +26,9 @@ #define SHARE_JFR_RECORDER_SERVICE_JFRRECORDERTHREAD_HPP #include "memory/allStatic.hpp" +#include "runtime/javaThread.hpp" #include "utilities/debug.hpp" -class JavaThread; class JfrCheckpointManager; class JfrPostBox; class Thread; @@ -42,4 +42,12 @@ class JfrRecorderThreadEntry : AllStatic { static bool start(JfrCheckpointManager* cp_manager, JfrPostBox* post_box, TRAPS); }; +class JfrRecorderThread : public JavaThread { + public: + JfrRecorderThread(ThreadFunction entry_point) : JavaThread(entry_point) {} + virtual ~JfrRecorderThread() {} + + virtual bool is_JfrRecorder_thread() const { return true; } +}; + #endif // SHARE_JFR_RECORDER_SERVICE_JFRRECORDERTHREAD_HPP diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp index e248e0f05be12..71cba9ec08533 100644 --- a/src/hotspot/share/runtime/vmStructs.cpp +++ b/src/hotspot/share/runtime/vmStructs.cpp @@ -44,6 +44,7 @@ #include "gc/shared/vmStructs_gc.hpp" #include "interpreter/bytecodes.hpp" #include "interpreter/interpreter.hpp" +#include "jfr/recorder/service/jfrRecorderThread.hpp" #include "logging/logAsyncWriter.hpp" #include "memory/allocation.hpp" #include "memory/allocation.inline.hpp" @@ -1027,6 +1028,7 @@ declare_type(TrainingReplayThread, JavaThread) \ declare_type(StringDedupThread, JavaThread) \ declare_type(AttachListenerThread, JavaThread) \ + declare_type(JfrRecorderThread, JavaThread) \ DEBUG_ONLY(COMPILER2_OR_JVMCI_PRESENT( \ declare_type(DeoptimizeObjectsALotThread, JavaThread))) \ declare_toplevel_type(OSThread) \ diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java index dfc49d1a81fdf..c913c6645f669 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java @@ -158,6 +158,7 @@ private static synchronized void initialize(TypeDataBase db) { virtualConstructor.addMapping("JvmtiAgentThread", JavaThread.class); virtualConstructor.addMapping("NotificationThread", JavaThread.class); virtualConstructor.addMapping("AttachListenerThread", JavaThread.class); + virtualConstructor.addMapping("JfrRecorderThread", JavaThread.class); // These are all the hidden JavaThread subclasses that don't execute java code. virtualConstructor.addMapping("StringDedupThread", HiddenJavaThread.class); @@ -195,7 +196,8 @@ public JavaThread createJavaThreadWrapper(Address threadAddr) { } catch (Exception e) { throw new RuntimeException("Unable to deduce type of thread from address " + threadAddr + " (expected type JavaThread, CompilerThread, MonitorDeflationThread, AttachListenerThread," + - " DeoptimizeObjectsALotThread, StringDedupThread, NotificationThread, ServiceThread or JvmtiAgentThread)", e); + " DeoptimizeObjectsALotThread, StringDedupThread, NotificationThread, ServiceThread," + + " JfrRecorderThread, or JvmtiAgentThread)", e); } } diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackWithConcurrentLock.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackWithConcurrentLock.java index 43926941a1a67..64080b252c5ba 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackWithConcurrentLock.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackWithConcurrentLock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,7 @@ public static void main(String[] args) throws Exception { theApp = new LingeredAppWithConcurrentLock(); // Use a small heap so the scan is quick. - LingeredApp.startApp(theApp, "-Xmx4m"); + LingeredApp.startApp(theApp, "-Xmx8m"); System.out.println("Started LingeredApp with pid " + theApp.getPid()); // Run the 'jstack -l' command to get the stack and have java.util.concurrent