Skip to content

Commit d82f875

Browse files
committed
GH-622 cache StackTraceElement instances
1 parent ac64b9c commit d82f875

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/CPUSamplerViewSupport.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ static final class CPUViewSupport extends JPanel implements JFREventVisitor {
7878

7979
private List<JFREventWithStack> data;
8080
private Set<String> ignoredEvents;
81+
private JFRThreadInfoSupport tiSupport;
8182

8283

8384
CPUViewSupport(JFRModel model) {
@@ -95,6 +96,7 @@ public void init() {
9596
if (hasData) {
9697
data = new ArrayList<>();
9798
ignoredEvents = new HashSet<>();
99+
tiSupport = new JFRThreadInfoSupport();
98100
}
99101
}
100102

@@ -104,7 +106,7 @@ public boolean visit(String typeName, JFREvent event) {
104106

105107
try {
106108
if (!ignoredEvents.contains(typeName))
107-
data.add(new JFREventWithStack(typeName, event, model));
109+
data.add(new JFREventWithStack(typeName, event, model, tiSupport));
108110
} catch (JFRPropertyNotAvailableException e) {
109111
ignoredEvents.add(typeName);
110112
}
@@ -132,6 +134,7 @@ public void done() {
132134

133135
data = null;
134136
ignoredEvents = null;
137+
tiSupport = null;
135138
threads = null;
136139

137140
try {
@@ -200,7 +203,7 @@ private static class JFREventWithStack implements Comparable<JFREventWithStack>
200203
private final Map<String, Object> threadInfo;
201204

202205

203-
JFREventWithStack(String type, JFREvent event, JFRModel model) throws JFRPropertyNotAvailableException {
206+
JFREventWithStack(String type, JFREvent event, JFRModel model, JFRThreadInfoSupport tiSupport) throws JFRPropertyNotAvailableException {
204207
JFRStackTrace stack;
205208
if ("jdk.ThreadEnd".equals(type)) { // NOI18N
206209
stack = null;
@@ -219,8 +222,8 @@ private static class JFREventWithStack implements Comparable<JFREventWithStack>
219222
if (eventTimeI == null) throw new JFRPropertyNotAvailableException("Must define eventTime to include into sampled snapshot"); // NOI18N
220223
eventTime = ValuesConverter.instantToRelativeNanos(eventTimeI, model);
221224

222-
if (profilingEvent) threadInfo = JFRThreadInfoSupport.getThreadInfo(thread, stack, event.getString("state")); // NOI18N
223-
else threadInfo = JFRThreadInfoSupport.getThreadInfo(thread, stack, getState(type));
225+
if (profilingEvent) threadInfo = tiSupport.getThreadInfo(thread, stack, event.getString("state")); // NOI18N
226+
else threadInfo = tiSupport.getThreadInfo(thread, stack, getState(type));
224227
}
225228

226229

visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/JFRThreadInfoSupport.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,17 @@ final class JFRThreadInfoSupport {
4141
static final String THREAD_ID = "tid"; // NOI18N
4242
static final String THREAD_STACK = "stack"; // NOI18N
4343

44-
static Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, String state) {
44+
private final Map<StackTraceElement,StackTraceElement> cache;
45+
46+
JFRThreadInfoSupport() {
47+
cache = new HashMap<>();
48+
}
49+
50+
Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, String state) {
4551
return getThreadInfo(thread, stack, state(state));
4652
}
4753

48-
static Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, Thread.State state) {
54+
Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, Thread.State state) {
4955
Map<String,Object> threadInfo = new HashMap<>();
5056

5157
Long id = Long.valueOf(thread.getId());
@@ -61,7 +67,7 @@ static Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, T
6167
}
6268

6369

64-
private static StackTraceElement[] stackTrace(JFRStackTrace stack) {
70+
private StackTraceElement[] stackTrace(JFRStackTrace stack) {
6571
List<JFRStackFrame> frames = stack.getFrames();
6672
StackTraceElement[] elements = new StackTraceElement[frames.size()];
6773

@@ -71,7 +77,7 @@ private static StackTraceElement[] stackTrace(JFRStackTrace stack) {
7177
return elements;
7278
}
7379

74-
private static StackTraceElement stackTraceElement(JFRStackFrame frame) {
80+
private StackTraceElement stackTraceElement(JFRStackFrame frame) {
7581
JFRMethod method = frame.getMethod();
7682

7783
String className = method == null ? null : method.getType().getName(); // NOI18N
@@ -82,7 +88,8 @@ private static StackTraceElement stackTraceElement(JFRStackFrame frame) {
8288

8389
int lineNumber = "Native".equals(frame.getType()) ? -2 : frame.getLine(); // NOI18N
8490

85-
return new StackTraceElement(className, methodName, null, lineNumber);
91+
StackTraceElement el = new StackTraceElement(className, methodName, null, lineNumber);
92+
return cache.computeIfAbsent(el, v -> el);
8693
}
8794

8895
private static Thread.State state(String state) {

0 commit comments

Comments
 (0)