Skip to content

Commit e0a6d6b

Browse files
committed
GH-574 do not call heap.getJavaClassByName(java.lang.VirtualThread) in the loop for every thread
1 parent df398f5 commit e0a6d6b

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsProvider.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ class JavaThreadsProvider {
7070
private static final String JNI_LOCAL = Bundle.JavaThreadsProvider_JniLocal();
7171

7272

73-
static String getThreadName(Instance instance) {
74-
if (isVirtualThread(instance)) {
73+
static String getThreadName(JavaClass vtClass, Instance instance) {
74+
if (isVirtualThread(vtClass, instance)) {
7575
return "Virtual Thread "+DetailsSupport.getDetailsString(instance); // NOI18N
7676
}
7777
String threadName = getThreadInstanceName(instance);
@@ -137,6 +137,7 @@ static HeapViewerNode[] getThreadsNodes(RootNode rootNode, Heap heap) throws Int
137137
List<HeapViewerNode> threadNodes = new ArrayList();
138138

139139
Collection<GCRoot> roots = heap.getGCRoots();
140+
JavaClass vtClass = heap.getJavaClassByName("java.lang.VirtualThread"); // NOI18N
140141
Map<ThreadObjectGCRoot,Map<Integer,List<GCRoot>>> javaFrameMap = computeJavaFrameMap(roots);
141142
ThreadObjectGCRoot oome = JavaThreadsProvider.getOOMEThread(heap);
142143

@@ -150,7 +151,7 @@ static HeapViewerNode[] getThreadsNodes(RootNode rootNode, Heap heap) throws Int
150151
StackTraceElement stack[] = threadRoot.getStackTrace();
151152
Map<Integer,List<GCRoot>> localsMap = javaFrameMap.get(threadRoot);
152153

153-
String tName = JavaThreadsProvider.getThreadName(threadInstance);
154+
String tName = JavaThreadsProvider.getThreadName(vtClass, threadInstance);
154155

155156
final List<HeapViewerNode> stackFrameNodes = new ArrayList();
156157
ThreadNode threadNode = new ThreadNode(tName, threadRoot.equals(oome), threadInstance) {
@@ -210,6 +211,7 @@ static String getThreadsHTML(HeapContext context) {
210211
Map<ThreadObjectGCRoot,Map<Integer,List<GCRoot>>> javaFrameMap = computeJavaFrameMap(roots);
211212
ThreadObjectGCRoot oome = JavaThreadsProvider.getOOMEThread(heap);
212213
JavaClass javaClassClass = heap.getJavaClassByName(Class.class.getName());
214+
JavaClass vtClass = heap.getJavaClassByName("java.lang.VirtualThread"); // NOI18N
213215
// Use this to enable VisualVM color scheme for threads dumps:
214216
// sw.append("<pre style='color: #cc3300;'>"); // NOI18N
215217
sb.append("<head><style>span.g {color: #666666;}</style></head>");
@@ -219,7 +221,7 @@ static String getThreadsHTML(HeapContext context) {
219221
ThreadObjectGCRoot threadRoot = (ThreadObjectGCRoot)root;
220222
Instance threadInstance = threadRoot.getInstance();
221223
if (threadInstance != null) {
222-
String threadName = JavaThreadsProvider.getThreadName(threadInstance);
224+
String threadName = JavaThreadsProvider.getThreadName(vtClass, threadInstance);
223225
StackTraceElement stack[] = threadRoot.getStackTrace();
224226
Map<Integer,List<GCRoot>> localsMap = javaFrameMap.get(threadRoot);
225227
String style=""; // NOI18N
@@ -303,11 +305,9 @@ private static String getThreadInstanceName(Instance threadInstance) {
303305
return DetailsSupport.getDetailsString((Instance)threadName);
304306
}
305307

306-
private static boolean isVirtualThread(Instance threadInstance) {
307-
JavaClass threadClass = threadInstance.getJavaClass();
308-
Heap h = threadClass.getHeap();
309-
JavaClass vtClass = h.getJavaClassByName("java.lang.VirtualThread"); // NOI18N
308+
private static boolean isVirtualThread(JavaClass vtClass, Instance threadInstance) {
310309
if (vtClass != null) {
310+
JavaClass threadClass = threadInstance.getJavaClass();
311311
for (;threadClass != null; threadClass = threadClass.getSuperClass()) {
312312
if (threadClass.equals(vtClass)) return true;
313313
}

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsSummary.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.graalvm.visualvm.heapviewer.ui.HeapViewerNodeAction;
5858
import org.graalvm.visualvm.heapviewer.ui.SummaryView;
5959
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
60+
import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
6061
import org.graalvm.visualvm.lib.jfluid.heap.ThreadObjectGCRoot;
6162
import org.graalvm.visualvm.lib.ui.components.ProfilerToolbar;
6263
import org.graalvm.visualvm.lib.ui.swing.ProfilerTable;
@@ -95,7 +96,8 @@ private JavaThreadsSummary(Instance oomeInstance, HeapContext context, HeapViewe
9596
this.actions = actions;
9697
this.actionProviders = actionProviders;
9798

98-
String threadName = JavaThreadsProvider.getThreadName(oomeInstance);
99+
JavaClass vtClass = oomeInstance.getJavaClass().getHeap().getJavaClassByName("java.lang.VirtualThread"); // NOI18N
100+
String threadName = JavaThreadsProvider.getThreadName(vtClass, oomeInstance);
99101
threadData = new Object[][] {{ new ThreadNode(threadName, true, oomeInstance) }};
100102
}
101103

0 commit comments

Comments
 (0)