Skip to content

Commit

Permalink
GH-574 do not call heap.getJavaClassByName(java.lang.VirtualThread) i…
Browse files Browse the repository at this point in the history
…n the loop for every thread
  • Loading branch information
thurka committed May 10, 2024
1 parent df398f5 commit e0a6d6b
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ class JavaThreadsProvider {
private static final String JNI_LOCAL = Bundle.JavaThreadsProvider_JniLocal();


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

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

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

String tName = JavaThreadsProvider.getThreadName(threadInstance);
String tName = JavaThreadsProvider.getThreadName(vtClass, threadInstance);

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

private static boolean isVirtualThread(Instance threadInstance) {
JavaClass threadClass = threadInstance.getJavaClass();
Heap h = threadClass.getHeap();
JavaClass vtClass = h.getJavaClassByName("java.lang.VirtualThread"); // NOI18N
private static boolean isVirtualThread(JavaClass vtClass, Instance threadInstance) {
if (vtClass != null) {
JavaClass threadClass = threadInstance.getJavaClass();
for (;threadClass != null; threadClass = threadClass.getSuperClass()) {
if (threadClass.equals(vtClass)) return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
import org.graalvm.visualvm.heapviewer.ui.HeapViewerNodeAction;
import org.graalvm.visualvm.heapviewer.ui.SummaryView;
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
import org.graalvm.visualvm.lib.jfluid.heap.ThreadObjectGCRoot;
import org.graalvm.visualvm.lib.ui.components.ProfilerToolbar;
import org.graalvm.visualvm.lib.ui.swing.ProfilerTable;
Expand Down Expand Up @@ -95,7 +96,8 @@ private JavaThreadsSummary(Instance oomeInstance, HeapContext context, HeapViewe
this.actions = actions;
this.actionProviders = actionProviders;

String threadName = JavaThreadsProvider.getThreadName(oomeInstance);
JavaClass vtClass = oomeInstance.getJavaClass().getHeap().getJavaClassByName("java.lang.VirtualThread"); // NOI18N
String threadName = JavaThreadsProvider.getThreadName(vtClass, oomeInstance);
threadData = new Object[][] {{ new ThreadNode(threadName, true, oomeInstance) }};
}

Expand Down

0 comments on commit e0a6d6b

Please sign in to comment.