36
36
import org .graalvm .visualvm .heapviewer .java .LocalObjectNode ;
37
37
import org .graalvm .visualvm .heapviewer .java .StackFrameNode ;
38
38
import org .graalvm .visualvm .heapviewer .java .ThreadNode ;
39
+ import org .graalvm .visualvm .heapviewer .java .ThreadStateNode ;
39
40
import org .graalvm .visualvm .heapviewer .model .HeapViewerNode ;
40
41
import org .graalvm .visualvm .heapviewer .model .RootNode ;
41
42
import org .graalvm .visualvm .heapviewer .utils .HeapUtils ;
@@ -69,31 +70,57 @@ class JavaThreadsProvider {
69
70
private static final String LOCAL_VARIABLE = Bundle .JavaThreadsProvider_LocalVariable ();
70
71
private static final String JNI_LOCAL = Bundle .JavaThreadsProvider_JniLocal ();
71
72
72
-
73
- static String getThreadName (JavaClass vtClass , Instance instance ) {
74
- if (isVirtualThread (vtClass , instance )) {
75
- return "Virtual Thread " +DetailsSupport .getDetailsString (instance ); // NOI18N
73
+ private static class ThreadInfo {
74
+
75
+ String threadName ;
76
+ Long threadId ;
77
+ Boolean daemon ;
78
+ Integer priority ;
79
+ Thread .State threadState ;
80
+ String virtualName ;
81
+
82
+ ThreadInfo (JavaClass vtClass , Instance instance ) {
83
+ if (isVirtualThread (vtClass , instance )) {
84
+ virtualName = "Virtual Thread " +DetailsSupport .getDetailsString (instance ); // NOI18N
85
+ return ;
86
+ }
87
+ threadName = getThreadInstanceName (instance );
88
+ threadId = (Long ) instance .getValueOfField ("tid" ); // NOI18N
89
+ daemon = (Boolean ) instance .getValueOfField ("daemon" ); // NOI18N
90
+ priority = (Integer ) instance .getValueOfField ("priority" ); // NOI18N
91
+ Integer threadStatus = (Integer ) instance .getValueOfField ("threadStatus" ); // NOI18N
92
+
93
+ if (daemon == null ) {
94
+ Instance holder = (Instance ) instance .getValueOfField ("holder" ); // NOI18N
95
+ if (holder != null ) {
96
+ daemon = (Boolean ) holder .getValueOfField ("daemon" ); // NOI18N
97
+ priority = (Integer ) holder .getValueOfField ("priority" ); // NOI18N
98
+ threadStatus = (Integer ) holder .getValueOfField ("threadStatus" ); // NOI18N
99
+ }
100
+ }
101
+ if (threadStatus != null ) {
102
+ threadState = toThreadState (threadStatus .intValue ());
103
+ }
104
+ }
105
+
106
+ Thread .State getThreadState () {
107
+ return threadState ;
76
108
}
77
- String threadName = getThreadInstanceName (instance );
78
- Long threadId = (Long )instance .getValueOfField ("tid" ); // NOI18N
79
- Boolean daemon = (Boolean )instance .getValueOfField ("daemon" ); // NOI18N
80
- Integer priority = (Integer )instance .getValueOfField ("priority" ); // NOI18N
81
- Integer threadStatus = (Integer )instance .getValueOfField ("threadStatus" ); // NOI18N
82
109
83
- if (daemon == null ) {
84
- Instance holder = (Instance )instance .getValueOfField ("holder" ); // NOI18N
85
- if (holder != null ) {
86
- daemon = (Boolean )holder .getValueOfField ("daemon" ); // NOI18N
87
- priority = (Integer )holder .getValueOfField ("priority" ); // NOI18N
88
- threadStatus = (Integer )holder .getValueOfField ("threadStatus" ); // NOI18N
110
+ public String toString () {
111
+ if (virtualName != null ) {
112
+ return virtualName ;
89
113
}
114
+ String tName = "\" " + threadName + "\" " + (daemon .booleanValue () ? " daemon" : "" ) + " prio=" + priority ; // NOI18N
115
+ if (threadId != null ) tName += " tid=" + threadId ; // NOI18N
116
+ if (threadState != null ) tName += " " + threadState ; // NOI18N
117
+
118
+ return tName ;
90
119
}
120
+ }
91
121
92
- String tName = "\" " + threadName + "\" " + (daemon .booleanValue () ? " daemon" : "" ) + " prio=" + priority ; // NOI18N
93
- if (threadId != null ) tName += " tid=" + threadId ; // NOI18N
94
- if (threadStatus != null ) tName += " " + toThreadState (threadStatus .intValue ()); // NOI18N
95
-
96
- return tName ;
122
+ static String getThreadName (JavaClass vtClass , Instance instance ) {
123
+ return new ThreadInfo (vtClass , instance ).toString ();
97
124
}
98
125
99
126
static ThreadObjectGCRoot getOOMEThread (Heap heap ) {
@@ -132,6 +159,28 @@ static HeapViewerNode getNode(URL url, HeapContext context) {
132
159
return null ;
133
160
}
134
161
162
+ static HeapViewerNode [] getStateNodes (RootNode root , Heap heap ) throws InterruptedException {
163
+ HeapViewerNode [] stateNodes ;
164
+ HeapViewerNode [] threadsNodes = getThreadsNodes (root , heap );
165
+ Map <Thread .State ,List <HeapViewerNode >> states = new HashMap <>();
166
+ for (HeapViewerNode n : threadsNodes ) {
167
+ Thread .State s = ((ThreadNode )n ).getState ();
168
+ List <HeapViewerNode > nodes = states .get (s );
169
+ if (nodes == null ) {
170
+ nodes = new ArrayList <>();
171
+ states .put (s , nodes );
172
+ }
173
+ nodes .add (n );
174
+ }
175
+ int i = 0 ;
176
+ stateNodes = new HeapViewerNode [states .size ()];
177
+ for (Map .Entry <Thread .State , List <HeapViewerNode >> stateEntry : states .entrySet ()) {
178
+ Thread .State state = stateEntry .getKey ();
179
+ ThreadStateNode stateNode = new ThreadStateNode (state , stateEntry .getValue ());
180
+ stateNodes [i ++] = stateNode ;
181
+ }
182
+ return stateNodes ;
183
+ }
135
184
136
185
static HeapViewerNode [] getThreadsNodes (RootNode rootNode , Heap heap ) throws InterruptedException {
137
186
List <HeapViewerNode > threadNodes = new ArrayList ();
@@ -151,10 +200,9 @@ static HeapViewerNode[] getThreadsNodes(RootNode rootNode, Heap heap) throws Int
151
200
StackTraceElement stack [] = threadRoot .getStackTrace ();
152
201
Map <Integer ,List <GCRoot >> localsMap = javaFrameMap .get (threadRoot );
153
202
154
- String tName = JavaThreadsProvider .getThreadName (vtClass , threadInstance );
155
-
203
+ ThreadInfo ti = new ThreadInfo (vtClass , threadInstance );
156
204
final List <HeapViewerNode > stackFrameNodes = new ArrayList ();
157
- ThreadNode threadNode = new ThreadNode (tName , threadRoot .equals (oome ), threadInstance ) {
205
+ ThreadNode threadNode = new ThreadNode (ti . toString (), ti . getThreadState () , threadRoot .equals (oome ), threadInstance ) {
158
206
protected HeapViewerNode [] computeChildren (RootNode root ) {
159
207
return stackFrameNodes .toArray (HeapViewerNode .NO_NODES );
160
208
}
0 commit comments