Skip to content

Commit 7b0adcc

Browse files
[GR-61151] Remove internal frames from the top of JFR event stacktraces.
PullRequest: graal/20641
2 parents 3f69a2d + 71c6ad2 commit 7b0adcc

30 files changed

+418
-106
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/JfrEvent.java

+26-13
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* IDs depend on the JDK version (see metadata.xml file) and are computed at image build time.
3939
*/
4040
public final class JfrEvent {
41-
public static final JfrEvent ThreadStart = create("jdk.ThreadStart");
41+
public static final JfrEvent ThreadStart = create("jdk.ThreadStart", 4);
4242
public static final JfrEvent ThreadEnd = create("jdk.ThreadEnd");
4343
public static final JfrEvent ThreadCPULoad = create("jdk.ThreadCPULoad");
4444
public static final JfrEvent DataLoss = create("jdk.DataLoss");
@@ -60,41 +60,54 @@ public final class JfrEvent {
6060
public static final JfrEvent SafepointBegin = create("jdk.SafepointBegin", JfrEventFlags.HasDuration);
6161
public static final JfrEvent SafepointEnd = create("jdk.SafepointEnd", JfrEventFlags.HasDuration);
6262
public static final JfrEvent ExecuteVMOperation = create("jdk.ExecuteVMOperation", JfrEventFlags.HasDuration);
63-
public static final JfrEvent JavaMonitorEnter = create("jdk.JavaMonitorEnter", JfrEventFlags.HasDuration);
64-
public static final JfrEvent ThreadPark = create("jdk.ThreadPark", JfrEventFlags.HasDuration);
65-
public static final JfrEvent JavaMonitorWait = create("jdk.JavaMonitorWait", JfrEventFlags.HasDuration);
66-
public static final JfrEvent JavaMonitorInflate = create("jdk.JavaMonitorInflate", JfrEventFlags.HasDuration);
67-
public static final JfrEvent ObjectAllocationInNewTLAB = create("jdk.ObjectAllocationInNewTLAB");
63+
public static final JfrEvent JavaMonitorEnter = create("jdk.JavaMonitorEnter", 5, JfrEventFlags.HasDuration);
64+
public static final JfrEvent ThreadPark = create("jdk.ThreadPark", 5, JfrEventFlags.HasDuration);
65+
public static final JfrEvent JavaMonitorWait = create("jdk.JavaMonitorWait", 5, JfrEventFlags.HasDuration);
66+
public static final JfrEvent JavaMonitorInflate = create("jdk.JavaMonitorInflate", 5, JfrEventFlags.HasDuration);
67+
public static final JfrEvent ObjectAllocationInNewTLAB = create("jdk.ObjectAllocationInNewTLAB", 5);
6868
public static final JfrEvent GCHeapSummary = create("jdk.GCHeapSummary");
6969
public static final JfrEvent ThreadAllocationStatistics = create("jdk.ThreadAllocationStatistics");
70-
public static final JfrEvent SystemGC = create("jdk.SystemGC", JfrEventFlags.HasDuration);
71-
public static final JfrEvent AllocationRequiringGC = create("jdk.AllocationRequiringGC");
72-
public static final JfrEvent OldObjectSample = create("jdk.OldObjectSample");
73-
public static final JfrEvent ObjectAllocationSample = create("jdk.ObjectAllocationSample", JfrEventFlags.SupportsThrottling);
70+
public static final JfrEvent SystemGC = create("jdk.SystemGC", 5, JfrEventFlags.HasDuration);
71+
public static final JfrEvent AllocationRequiringGC = create("jdk.AllocationRequiringGC", 5);
72+
public static final JfrEvent OldObjectSample = create("jdk.OldObjectSample", 7);
73+
public static final JfrEvent ObjectAllocationSample = create("jdk.ObjectAllocationSample", 5, JfrEventFlags.SupportsThrottling);
7474
public static final JfrEvent NativeMemoryUsage = create("jdk.NativeMemoryUsage");
7575
public static final JfrEvent NativeMemoryUsageTotal = create("jdk.NativeMemoryUsageTotal");
7676

7777
private final long id;
7878
private final String name;
7979
private final int flags;
80+
private final int skipCount;
8081

8182
@Platforms(Platform.HOSTED_ONLY.class)
82-
public static JfrEvent create(String name, JfrEventFlags... flags) {
83-
return new JfrEvent(name, flags);
83+
private static JfrEvent create(String name, JfrEventFlags... flags) {
84+
return new JfrEvent(name, -1, flags);
8485
}
8586

8687
@Platforms(Platform.HOSTED_ONLY.class)
87-
private JfrEvent(String name, JfrEventFlags... flags) {
88+
private static JfrEvent create(String name, int skipCount, JfrEventFlags... flags) {
89+
return new JfrEvent(name, skipCount, flags);
90+
}
91+
92+
@Platforms(Platform.HOSTED_ONLY.class)
93+
private JfrEvent(String name, int skipCount, JfrEventFlags... flags) {
8894
this.id = JfrMetadataTypeLibrary.lookupPlatformEvent(name);
8995
this.name = name;
9096
this.flags = EnumBitmask.computeBitmask(flags);
97+
this.skipCount = skipCount;
9198
}
9299

93100
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
94101
public long getId() {
95102
return id;
96103
}
97104

105+
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
106+
public int getSkipCount() {
107+
assert skipCount >= 0 : "method may only be called for events that need a stack trace";
108+
return skipCount;
109+
}
110+
98111
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
99112
public String getName() {
100113
return name;

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/JfrStackWalker.java

+3-10
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,7 @@ private static int recordIp(SamplerSampleWriterData data, CodePointer ip) {
272272
/* Increment the number of seen frames. */
273273
data.setSeenFrames(data.getSeenFrames() + 1);
274274

275-
if (shouldSkipFrame(data)) {
276-
return NO_ERROR;
277-
} else if (shouldTruncate(data)) {
275+
if (shouldTruncate(data)) {
278276
return TRUNCATED;
279277
}
280278

@@ -288,15 +286,10 @@ private static int recordIp(SamplerSampleWriterData data, CodePointer ip) {
288286
return BUFFER_SIZE_EXCEEDED;
289287
}
290288

291-
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
292-
private static boolean shouldSkipFrame(SamplerSampleWriterData data) {
293-
return data.getSeenFrames() <= data.getSkipCount();
294-
}
295-
296289
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
297290
private static boolean shouldTruncate(SamplerSampleWriterData data) {
298-
int numFrames = data.getSeenFrames() - data.getSkipCount();
299-
if (numFrames > data.getMaxDepth()) {
291+
int maxFrames = data.getMaxDepth() + data.getSkipCount();
292+
if (data.getSeenFrames() > maxFrames) {
300293
/* The stack size exceeds given depth. Stop walk! */
301294
data.setTruncated(true);
302295
return true;

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/SubstrateJVM.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,8 @@ public long getStackTraceId(int skipCount) {
294294
}
295295

296296
@Uninterruptible(reason = "Result is only valid until epoch changes.", callerMustBe = true)
297-
public long getStackTraceId(JfrEvent eventType, int skipCount) {
298-
return getStackTraceId(eventType.getId(), skipCount);
297+
public long getStackTraceId(JfrEvent eventType) {
298+
return getStackTraceId(eventType.getId(), eventType.getSkipCount());
299299
}
300300

301301
/**

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/AllocationRequiringGCEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ private static void emit0(UnsignedWord gcId, UnsignedWord size) {
5454
JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.AllocationRequiringGC);
5555
JfrNativeEventWriter.putLong(data, JfrTicks.elapsedTicks());
5656
JfrNativeEventWriter.putEventThread(data);
57-
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.AllocationRequiringGC, 0));
57+
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.AllocationRequiringGC));
5858
JfrNativeEventWriter.putLong(data, gcId.rawValue());
5959
JfrNativeEventWriter.putLong(data, size.rawValue());
6060
JfrNativeEventWriter.endSmallEvent(data);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorEnterEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static void emit0(Object obj, long previousOwnerTid, long startTicks) {
5757
JfrNativeEventWriter.putLong(data, startTicks);
5858
JfrNativeEventWriter.putLong(data, duration);
5959
JfrNativeEventWriter.putEventThread(data);
60-
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.JavaMonitorEnter, 0));
60+
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.JavaMonitorEnter));
6161
JfrNativeEventWriter.putClass(data, obj.getClass());
6262
JfrNativeEventWriter.putThread(data, previousOwnerTid);
6363
JfrNativeEventWriter.putLong(data, Word.objectToUntrackedPointer(obj).rawValue());

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorInflateEvent.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
package com.oracle.svm.core.jfr.events;
2828

29-
import jdk.graal.compiler.word.Word;
3029
import org.graalvm.nativeimage.StackValue;
3130

3231
import com.oracle.svm.core.Uninterruptible;
@@ -39,6 +38,8 @@
3938
import com.oracle.svm.core.jfr.SubstrateJVM;
4039
import com.oracle.svm.core.monitor.MonitorInflationCause;
4140

41+
import jdk.graal.compiler.word.Word;
42+
4243
public class JavaMonitorInflateEvent {
4344
public static void emit(Object obj, long startTicks, MonitorInflationCause cause) {
4445
if (HasJfrSupport.get()) {
@@ -47,7 +48,7 @@ public static void emit(Object obj, long startTicks, MonitorInflationCause cause
4748
}
4849

4950
@Uninterruptible(reason = "Accesses a JFR buffer.")
50-
public static void emit0(Object obj, long startTicks, MonitorInflationCause cause) {
51+
private static void emit0(Object obj, long startTicks, MonitorInflationCause cause) {
5152
long duration = JfrTicks.duration(startTicks);
5253
if (JfrEvent.JavaMonitorInflate.shouldEmit(duration)) {
5354
JfrNativeEventWriterData data = StackValue.get(JfrNativeEventWriterData.class);
@@ -57,7 +58,7 @@ public static void emit0(Object obj, long startTicks, MonitorInflationCause caus
5758
JfrNativeEventWriter.putLong(data, startTicks);
5859
JfrNativeEventWriter.putLong(data, duration);
5960
JfrNativeEventWriter.putEventThread(data);
60-
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.JavaMonitorInflate, 0));
61+
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.JavaMonitorInflate));
6162
JfrNativeEventWriter.putClass(data, obj.getClass());
6263
JfrNativeEventWriter.putLong(data, Word.objectToUntrackedPointer(obj).rawValue());
6364
JfrNativeEventWriter.putLong(data, getId(cause));

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorWaitEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private static void emit0(long startTicks, Object obj, long notifierTid, long ti
5858
JfrNativeEventWriter.putLong(data, startTicks);
5959
JfrNativeEventWriter.putLong(data, duration);
6060
JfrNativeEventWriter.putEventThread(data);
61-
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.JavaMonitorWait, 0));
61+
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.JavaMonitorWait));
6262
JfrNativeEventWriter.putClass(data, obj.getClass());
6363
JfrNativeEventWriter.putThread(data, notifierTid);
6464
JfrNativeEventWriter.putLong(data, timeout);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JfrAllocationEvents.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private static void emitObjectAllocationInNewTLAB(long startTicks, DynamicHub hu
6868
JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.ObjectAllocationInNewTLAB);
6969
JfrNativeEventWriter.putLong(data, startTicks);
7070
JfrNativeEventWriter.putEventThread(data);
71-
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.ObjectAllocationInNewTLAB, 0));
71+
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.ObjectAllocationInNewTLAB));
7272
JfrNativeEventWriter.putClass(data, DynamicHub.toClass(hub));
7373
JfrNativeEventWriter.putLong(data, allocationSize.rawValue());
7474
JfrNativeEventWriter.putLong(data, tlabSize.rawValue());
@@ -88,7 +88,7 @@ private static void emitObjectAllocationSample(long startTicks, DynamicHub hub)
8888
JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.ObjectAllocationSample);
8989
JfrNativeEventWriter.putLong(data, startTicks);
9090
JfrNativeEventWriter.putEventThread(data);
91-
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.ObjectAllocationSample, 0));
91+
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.ObjectAllocationSample));
9292
JfrNativeEventWriter.putClass(data, DynamicHub.toClass(hub));
9393
JfrNativeEventWriter.putLong(data, weight);
9494
JfrNativeEventWriter.endSmallEvent(data);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/SystemGCEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ private static void emit0(long startTicks, boolean invokedConcurrent) {
5555
JfrNativeEventWriter.putLong(data, startTicks);
5656
JfrNativeEventWriter.putLong(data, duration);
5757
JfrNativeEventWriter.putEventThread(data);
58-
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.SystemGC, 0));
58+
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.SystemGC));
5959
JfrNativeEventWriter.putBoolean(data, invokedConcurrent);
6060
JfrNativeEventWriter.endSmallEvent(data);
6161
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadParkEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private static void emit0(long startTicks, Object obj, boolean isAbsolute, long
6868
JfrNativeEventWriter.putLong(data, startTicks);
6969
JfrNativeEventWriter.putLong(data, duration);
7070
JfrNativeEventWriter.putEventThread(data);
71-
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.ThreadPark, 0));
71+
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.ThreadPark));
7272
JfrNativeEventWriter.putClass(data, parkedClass);
7373
JfrNativeEventWriter.putLong(data, timeout);
7474
JfrNativeEventWriter.putLong(data, until);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadStartEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public static void emit(Thread thread) {
4545
JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.ThreadStart);
4646
JfrNativeEventWriter.putLong(data, JfrTicks.elapsedTicks());
4747
JfrNativeEventWriter.putEventThread(data);
48-
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.ThreadStart, 0));
48+
JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.ThreadStart));
4949
JfrNativeEventWriter.putThread(data, thread);
5050
JfrNativeEventWriter.putThread(data, JavaThreads.getParentThreadId(thread));
5151
JfrNativeEventWriter.endSmallEvent(data);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/oldobject/JfrOldObjectSampler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ private void release(JfrOldObject sample) {
148148
private void store(Object obj, UnsignedWord span, UnsignedWord allocatedSize, int arrayLength) {
149149
Thread thread = JavaThreads.getCurrentThreadOrNull();
150150
long threadId = thread == null ? 0L : JavaThreads.getThreadId(thread);
151-
long stackTraceId = thread == null ? 0L : SubstrateJVM.get().getStackTraceId(JfrEvent.OldObjectSample, 0);
151+
long stackTraceId = thread == null ? 0L : SubstrateJVM.get().getStackTraceId(JfrEvent.OldObjectSample);
152152
UnsignedWord heapUsedAfterLastGC = Heap.getHeap().getUsedMemoryAfterLastGC();
153153

154154
JfrOldObject sample = (JfrOldObject) freeList.pop();

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/sampler/SamplerBuffersAccess.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ private static void serializeStackTraces(SamplerBuffer rawStackTraceBuffer) {
115115
int sampleSize = current.readInt(0);
116116
current = current.add(Integer.BYTES);
117117

118-
/* Padding. */
118+
/* Number of vframes that should be skipped at the top of the stack trace. */
119+
int skipCount = current.readInt(0);
119120
current = current.add(Integer.BYTES);
120121

121122
/* Tick. */
@@ -132,16 +133,16 @@ private static void serializeStackTraces(SamplerBuffer rawStackTraceBuffer) {
132133

133134
assert current.subtract(entryStart).equal(SamplerSampleWriter.getHeaderSize());
134135

135-
current = serializeStackTrace(current, end, sampleSize, sampleHash, isTruncated, sampleTick, threadId, threadState);
136+
current = serializeStackTrace(current, end, sampleSize, sampleHash, isTruncated, sampleTick, threadId, threadState, skipCount);
136137
}
137138

138139
SamplerBufferAccess.reinitialize(rawStackTraceBuffer);
139140
}
140141

141142
@Uninterruptible(reason = "Wraps the call to the possibly interruptible serializer.", calleeMustBe = false)
142143
private static Pointer serializeStackTrace(Pointer rawStackTrace, Pointer bufferEnd, int sampleSize, int sampleHash,
143-
boolean isTruncated, long sampleTick, long threadId, long threadState) {
144+
boolean isTruncated, long sampleTick, long threadId, long threadState, int skipCount) {
144145
return SamplerStackTraceSerializer.singleton().serializeStackTrace(rawStackTrace, bufferEnd, sampleSize,
145-
sampleHash, isTruncated, sampleTick, threadId, threadState);
146+
sampleHash, isTruncated, sampleTick, threadId, threadState, skipCount);
146147
}
147148
}

0 commit comments

Comments
 (0)