@@ -41,11 +41,17 @@ final class JFRThreadInfoSupport {
41
41
static final String THREAD_ID = "tid" ; // NOI18N
42
42
static final String THREAD_STACK = "stack" ; // NOI18N
43
43
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 ) {
45
51
return getThreadInfo (thread , stack , state (state ));
46
52
}
47
53
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 ) {
49
55
Map <String ,Object > threadInfo = new HashMap <>();
50
56
51
57
Long id = Long .valueOf (thread .getId ());
@@ -61,7 +67,7 @@ static Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, T
61
67
}
62
68
63
69
64
- private static StackTraceElement [] stackTrace (JFRStackTrace stack ) {
70
+ private StackTraceElement [] stackTrace (JFRStackTrace stack ) {
65
71
List <JFRStackFrame > frames = stack .getFrames ();
66
72
StackTraceElement [] elements = new StackTraceElement [frames .size ()];
67
73
@@ -71,7 +77,7 @@ private static StackTraceElement[] stackTrace(JFRStackTrace stack) {
71
77
return elements ;
72
78
}
73
79
74
- private static StackTraceElement stackTraceElement (JFRStackFrame frame ) {
80
+ private StackTraceElement stackTraceElement (JFRStackFrame frame ) {
75
81
JFRMethod method = frame .getMethod ();
76
82
77
83
String className = method == null ? null : method .getType ().getName (); // NOI18N
@@ -82,7 +88,8 @@ private static StackTraceElement stackTraceElement(JFRStackFrame frame) {
82
88
83
89
int lineNumber = "Native" .equals (frame .getType ()) ? -2 : frame .getLine (); // NOI18N
84
90
85
- return new StackTraceElement (className , methodName , null , lineNumber );
91
+ StackTraceElement el = new StackTraceElement (className , methodName , null , lineNumber );
92
+ return cache .computeIfAbsent (el , v -> el );
86
93
}
87
94
88
95
private static Thread .State state (String state ) {
0 commit comments