Skip to content

Commit 0e2c478

Browse files
Feat/poc continuous profiling (#4556)
* wip * re-add data category profile_chunk, fix json naming, new converter based on jfr converter bundled with asyncprofiler * read java thread ids from jfr and use those instead of os thread ids, use existing SentryStackFrame instead of JfrFrame, * adhere to sentry conventions re format null safety etc, fix compilation * add profile-session-sample-rate to external options * add platform as constructor param to ProfileChunk, wip: set java continuous profiler in sentry init * add doubleToBigDecimal in JfrSample and ProfileChunk, same as we do it in SentrySpan to work around scientific notation of double, use wall clock profiling * rename JfrProfile to SentryProfile * move java profiling into its own module, load using SPI * [WIP] use getProfilingTracesDirPath * add missing build.gradle.kts for profiler module * WIP continuous profiling in trace mode * cleanup unused classes from vendor, cleanup packages * allow setting profiling-traces-dir-path independently from cache dir using external options * use profileChunk.platform to decide how to deal with the chunk instead of file extension * port relevant AndroidContinuousProfilerTest tests to JavaContinuousProfilerTest * add service loader tests for profiler and profile converter * remove old jfr test files * Support ProfileLifecycle.TRACE (#4576) * delete unused JfrFrame and JfrToSentryProfileconverter * use passed-in profilingTracesHz parameter instead of hardcoded value * start profiler before starting the transaction when ProfileLifecycle.TRACE is used to have the profile ID when SentryTracer is created * use improved way to calculate timestamp of sample * api dump * let profile-lifecycle be set from external_options, add tests for SpringBoot autoconfig * initialize stackTraceFactory only once per chunk * rename profile data classes, add deserialization and tests * extract methods in ProfileConverter, fix SentryProfile serialization and make fields private * use wall=[interval] instead of setting the event to wall and setting the interval separately, this seems to work better and create more samples * start/stop profiler in OtelSentrySpanProcesser in trace mode for root spans * add profiler dependency to jakarta-opentelemetry sample, add needed configs * add dependenies and config to spring-boot-jakarta sample * remove connection status check * extract event visitor * Add enum for ProfileChunk platform * fallback to default temp directory for profiling on jvm if directory is not configured * cleanup some minor things * remove ProfilingInitializer, fix comments * Format code * add getter/setter to sample and metadata * fix compile error * add comment/todo for deleteOnExit * Profiling - Deduplication and cleanup (#4681) * add readme and info about commit of the source repository * delete jfr file on jvm exit * further split into smaller methods * deduplicate frames in order to save bandwidth, add converter tests * remove Platform Enum, use string constants instead for compatibility with cross platform frameworks * implement equals and hashcode for SentryStackFrame to make frame deduplication work * bump api * improve error handling, fix start stop start flow * add new testfile * calculate ticksPerNanosecond in constructor * adapt Ratelimiter to check for both ProfileChunk and ProfileChunkUi ratelimiting * update ratelimiter test to check for both profileChunk and profileChunkUi drops * use string constant instead of string * Format code * add non aggregating event collector to send each event individually, deduplicate stacks * adapt converter tests to new non-aggregated converter * Format code * add logging to loadProfileConverter * Format code * fix duplication of events * catch all exception happening when converting from jfr * add exists and writable info to log message * add method to safely delete file * remove setNative call * fix test * fix reference to commit we vendored from * drop event if it cannot be processed to not lose the whole chunk * make format * fix test * Format code * Profiling - OTEL profiling fix, Stabilization, Logging (#4746) * add skipProfiling flag to TransactionOptions to be able to skip profiling and handle cases where profiling has been started by otel * add profilerId to spanContext so that otel span processor can propagate this to the exporter and SentryTracer * immediately end profiling when stopProfiler is called * bump api, fix android api 24 code * catch all exception happening when converting from jfr * simplify JavaContinuous profiler by catching AsyncProfiler instantiation exceptions in provider * add exists and writable info to log message * add method to safely delete file * remove setNative call * fix test * fix reference to commit we vendored from * drop event if it cannot be processed to not lose the whole chunk * Format code * fix test * Format code * fix test * catch exceptions in startProfiler/stopProfiler * fallback to threadId -1 if it cannot be resolved --------- Co-authored-by: Sentry Github Bot <[email protected]> --------- Co-authored-by: Sentry Github Bot <[email protected]> --------- Co-authored-by: Sentry Github Bot <[email protected]> * change profiler api from Path to String to keep Android Api 21 compatibility * mark all profiling related classes as internal * Format code * mark Sentry profile classes internal * Format code * mark SentryThreadMetadata internal * add changelog entry * Format code * re-add asyncprofiler classes, cr changes * bump api * detect dangerous/invalid chars in profiling directory name * ignore vendored profile conversion code in codecov --------- Co-authored-by: Sentry Github Bot <[email protected]>
1 parent 604a261 commit 0e2c478

File tree

84 files changed

+6041
-61
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+6041
-61
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
## Features
6+
- Add support for continuous profiling of JVM applications on macOS and Linux ([#4556](https://github.com/getsentry/sentry-java/pull/4556))
7+
- Sentry continuous profiling on the JVM is using async-profiler under the hood.
8+
59
### Fixes
610

711
- Start performance collection on AppStart continuous profiling ([#4752](https://github.com/getsentry/sentry-java/pull/4752))

buildSrc/src/main/java/Config.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ object Config {
8383
val SENTRY_OKHTTP_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.okhttp"
8484
val SENTRY_REACTOR_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.reactor"
8585
val SENTRY_KOTLIN_EXTENSIONS_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.kotlin-extensions"
86+
val SENTRY_ASYNC_PROFILER_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.async-profiler"
8687
val SENTRY_KTOR_CLIENT_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.ktor-client"
8788
val group = "io.sentry"
8889
val description = "SDK for sentry.io"

codecov.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ ignore:
2020
- "sentry-system-test-support/*"
2121
- "sentry-test-support/*"
2222
- "sentry-samples/*"
23+
- "sentry-async-profiler/src/main/java/io/sentry/asyncprofiler/vendor/asyncprofiler/**"

sentry-android-core/src/main/java/io/sentry/android/core/AndroidContinuousProfiler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,8 @@ private void stop(final boolean restartProfiler) {
300300
chunkId,
301301
endData.measurementsMap,
302302
endData.traceFile,
303-
startProfileChunkTimestamp));
303+
startProfileChunkTimestamp,
304+
ProfileChunk.PLATFORM_ANDROID));
304305
}
305306
}
306307

Lines changed: 336 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
1+
public final class io/sentry/asyncprofiler/BuildConfig {
2+
public static final field SENTRY_ASYNC_PROFILER_SDK_NAME Ljava/lang/String;
3+
public static final field VERSION_NAME Ljava/lang/String;
4+
}
5+
6+
public final class io/sentry/asyncprofiler/convert/JfrAsyncProfilerToSentryProfileConverter : io/sentry/asyncprofiler/vendor/asyncprofiler/convert/JfrConverter {
7+
public fun <init> (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrReader;Lio/sentry/asyncprofiler/vendor/asyncprofiler/convert/Arguments;Lio/sentry/SentryStackTraceFactory;Lio/sentry/ILogger;)V
8+
public static fun convertFromFileStatic (Ljava/lang/String;)Lio/sentry/protocol/profiling/SentryProfile;
9+
}
10+
11+
public final class io/sentry/asyncprofiler/convert/NonAggregatingEventCollector : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector {
12+
public fun <init> ()V
13+
public fun afterChunk ()V
14+
public fun beforeChunk ()V
15+
public fun collect (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;)V
16+
public fun finish ()Z
17+
public fun forEach (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector$Visitor;)V
18+
}
19+
20+
public final class io/sentry/asyncprofiler/profiling/JavaContinuousProfiler : io/sentry/IContinuousProfiler, io/sentry/transport/RateLimiter$IRateLimitObserver {
21+
public fun <init> (Lio/sentry/ILogger;Ljava/lang/String;ILio/sentry/ISentryExecutorService;)V
22+
public fun close (Z)V
23+
public fun getChunkId ()Lio/sentry/protocol/SentryId;
24+
public fun getProfilerId ()Lio/sentry/protocol/SentryId;
25+
public fun getRootSpanCounter ()I
26+
public fun isRunning ()Z
27+
public fun onRateLimitChanged (Lio/sentry/transport/RateLimiter;)V
28+
public fun reevaluateSampling ()V
29+
public fun startProfiler (Lio/sentry/ProfileLifecycle;Lio/sentry/TracesSampler;)V
30+
public fun stopProfiler (Lio/sentry/ProfileLifecycle;)V
31+
}
32+
33+
public final class io/sentry/asyncprofiler/provider/AsyncProfilerContinuousProfilerProvider : io/sentry/profiling/JavaContinuousProfilerProvider {
34+
public fun <init> ()V
35+
public fun getContinuousProfiler (Lio/sentry/ILogger;Ljava/lang/String;ILio/sentry/ISentryExecutorService;)Lio/sentry/IContinuousProfiler;
36+
}
37+
38+
public final class io/sentry/asyncprofiler/provider/AsyncProfilerProfileConverterProvider : io/sentry/profiling/JavaProfileConverterProvider {
39+
public fun <init> ()V
40+
public fun getProfileConverter ()Lio/sentry/IProfileConverter;
41+
}
42+
43+
public final class io/sentry/asyncprofiler/provider/AsyncProfilerProfileConverterProvider$AsyncProfilerProfileConverter : io/sentry/IProfileConverter {
44+
public fun <init> ()V
45+
public fun convertFromFile (Ljava/lang/String;)Lio/sentry/protocol/profiling/SentryProfile;
46+
}
47+
48+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/convert/Arguments {
49+
public field alloc Z
50+
public field bci Z
51+
public field classify Z
52+
public field cpu Z
53+
public field dot Z
54+
public field exclude Ljava/util/regex/Pattern;
55+
public final field files Ljava/util/List;
56+
public field from J
57+
public field grain D
58+
public field help Z
59+
public field highlight Ljava/lang/String;
60+
public field include Ljava/util/regex/Pattern;
61+
public field inverted Z
62+
public field leak Z
63+
public field lines Z
64+
public field live Z
65+
public field lock Z
66+
public field minwidth D
67+
public field nativemem Z
68+
public field norm Z
69+
public field output Ljava/lang/String;
70+
public field reverse Z
71+
public field simple Z
72+
public field skip I
73+
public field state Ljava/lang/String;
74+
public field threads Z
75+
public field title Ljava/lang/String;
76+
public field to J
77+
public field total Z
78+
public field wall Z
79+
public fun <init> ([Ljava/lang/String;)V
80+
}
81+
82+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/convert/Frame : java/util/HashMap {
83+
public static final field TYPE_C1_COMPILED B
84+
public static final field TYPE_CPP B
85+
public static final field TYPE_INLINED B
86+
public static final field TYPE_INTERPRETED B
87+
public static final field TYPE_JIT_COMPILED B
88+
public static final field TYPE_KERNEL B
89+
public static final field TYPE_NATIVE B
90+
}
91+
92+
public abstract class io/sentry/asyncprofiler/vendor/asyncprofiler/convert/JfrConverter {
93+
protected final field args Lio/sentry/asyncprofiler/vendor/asyncprofiler/convert/Arguments;
94+
protected final field collector Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector;
95+
protected final field jfr Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrReader;
96+
protected field methodNames Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary;
97+
public fun <init> (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrReader;Lio/sentry/asyncprofiler/vendor/asyncprofiler/convert/Arguments;)V
98+
protected fun collectEvents ()V
99+
public fun convert ()V
100+
protected fun convertChunk ()V
101+
protected fun createCollector (Lio/sentry/asyncprofiler/vendor/asyncprofiler/convert/Arguments;)Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector;
102+
public synthetic fun getCategory (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/StackTrace;)Lio/sentry/asyncprofiler/vendor/asyncprofiler/convert/Classifier$Category;
103+
public fun getClassName (J)Ljava/lang/String;
104+
public fun getMethodName (JB)Ljava/lang/String;
105+
public fun getPlainThreadName (I)Ljava/lang/String;
106+
public fun getStackTraceElement (JBI)Ljava/lang/StackTraceElement;
107+
public fun getThreadName (I)Ljava/lang/String;
108+
protected fun getThreadStates (Z)Ljava/util/BitSet;
109+
protected fun isNativeFrame (B)Z
110+
protected fun toThreadState (Ljava/lang/String;)I
111+
protected fun toTicks (J)J
112+
}
113+
114+
protected abstract class io/sentry/asyncprofiler/vendor/asyncprofiler/convert/JfrConverter$AggregatedEventVisitor : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector$Visitor {
115+
protected fun <init> (Lio/sentry/asyncprofiler/vendor/asyncprofiler/convert/JfrConverter;)V
116+
protected abstract fun visit (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;J)V
117+
public final fun visit (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;JJ)V
118+
}
119+
120+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/ClassRef {
121+
public final field name J
122+
public fun <init> (J)V
123+
}
124+
125+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary {
126+
public fun <init> ()V
127+
public fun <init> (I)V
128+
public fun clear ()V
129+
public fun forEach (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary$Visitor;)V
130+
public fun get (J)Ljava/lang/Object;
131+
public fun preallocate (I)I
132+
public fun put (JLjava/lang/Object;)V
133+
public fun size ()I
134+
}
135+
136+
public abstract interface class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary$Visitor {
137+
public abstract fun visit (JLjava/lang/Object;)V
138+
}
139+
140+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/DictionaryInt {
141+
public fun <init> ()V
142+
public fun <init> (I)V
143+
public fun clear ()V
144+
public fun forEach (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/DictionaryInt$Visitor;)V
145+
public fun get (J)I
146+
public fun get (JI)I
147+
public fun preallocate (I)I
148+
public fun put (JI)V
149+
}
150+
151+
public abstract interface class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/DictionaryInt$Visitor {
152+
public abstract fun visit (JI)V
153+
}
154+
155+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrClass {
156+
public fun field (Ljava/lang/String;)Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrField;
157+
}
158+
159+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrField {
160+
}
161+
162+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrReader : java/io/Closeable {
163+
public field chunkEndNanos J
164+
public field chunkStartNanos J
165+
public field chunkStartTicks J
166+
public final field classes Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary;
167+
public field endNanos J
168+
public final field enums Ljava/util/Map;
169+
public final field javaThreads Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary;
170+
public final field methods Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary;
171+
public final field settings Ljava/util/Map;
172+
public final field stackTraces Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary;
173+
public field startNanos J
174+
public field startTicks J
175+
public field stopAtNewChunk Z
176+
public final field strings Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary;
177+
public final field symbols Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary;
178+
public final field threads Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary;
179+
public field ticksPerSec J
180+
public final field types Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/Dictionary;
181+
public final field typesByName Ljava/util/Map;
182+
public fun <init> (Ljava/lang/String;)V
183+
public fun <init> (Ljava/nio/ByteBuffer;)V
184+
public fun close ()V
185+
public fun durationNanos ()J
186+
public fun eof ()Z
187+
public fun getBytes ()[B
188+
public fun getDouble ()D
189+
public fun getEnumKey (Ljava/lang/String;Ljava/lang/String;)I
190+
public fun getEnumValue (Ljava/lang/String;I)Ljava/lang/String;
191+
public fun getFloat ()F
192+
public fun getString ()Ljava/lang/String;
193+
public fun getVarint ()I
194+
public fun getVarlong ()J
195+
public fun hasMoreChunks ()Z
196+
public fun incomplete ()Z
197+
public fun readAllEvents ()Ljava/util/List;
198+
public fun readAllEvents (Ljava/lang/Class;)Ljava/util/List;
199+
public fun readEvent ()Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;
200+
public fun readEvent (Ljava/lang/Class;)Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;
201+
public fun registerEvent (Ljava/lang/String;Ljava/lang/Class;)V
202+
}
203+
204+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/MethodRef {
205+
public final field cls J
206+
public final field name J
207+
public final field sig J
208+
public fun <init> (JJJ)V
209+
}
210+
211+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/StackTrace {
212+
public final field locations [I
213+
public final field methods [J
214+
public final field types [B
215+
public fun <init> ([J[B[I)V
216+
}
217+
218+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/AllocationSample : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event {
219+
public final field allocationSize J
220+
public final field classId I
221+
public final field tlabSize J
222+
public fun <init> (JIIIJJ)V
223+
public fun classId ()J
224+
public fun hashCode ()I
225+
public fun sameGroup (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;)Z
226+
public fun value ()J
227+
}
228+
229+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/CPULoad : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event {
230+
public final field jvmSystem F
231+
public final field jvmUser F
232+
public final field machineTotal F
233+
public fun <init> (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrReader;)V
234+
}
235+
236+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/ContendedLock : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event {
237+
public final field classId I
238+
public final field duration J
239+
public fun <init> (JIIJI)V
240+
public fun classId ()J
241+
public fun hashCode ()I
242+
public fun sameGroup (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;)Z
243+
public fun value ()J
244+
}
245+
246+
public abstract class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event : java/lang/Comparable {
247+
public final field stackTraceId I
248+
public final field tid I
249+
public final field time J
250+
protected fun <init> (JII)V
251+
public fun classId ()J
252+
public fun compareTo (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;)I
253+
public synthetic fun compareTo (Ljava/lang/Object;)I
254+
public fun hashCode ()I
255+
public fun sameGroup (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;)Z
256+
public fun samples ()J
257+
public fun toString ()Ljava/lang/String;
258+
public fun value ()J
259+
}
260+
261+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventAggregator : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector {
262+
public fun <init> (ZD)V
263+
public fun afterChunk ()V
264+
public fun beforeChunk ()V
265+
public fun coarsen (D)V
266+
public fun collect (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;)V
267+
public fun collect (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;JJ)V
268+
public fun finish ()Z
269+
public fun forEach (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector$Visitor;)V
270+
public fun size ()I
271+
}
272+
273+
public abstract interface class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector {
274+
public abstract fun afterChunk ()V
275+
public abstract fun beforeChunk ()V
276+
public abstract fun collect (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;)V
277+
public abstract fun finish ()Z
278+
public abstract fun forEach (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector$Visitor;)V
279+
}
280+
281+
public abstract interface class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector$Visitor {
282+
public abstract fun visit (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;JJ)V
283+
}
284+
285+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/ExecutionSample : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event {
286+
public final field samples I
287+
public final field threadState I
288+
public fun <init> (JIIII)V
289+
public fun samples ()J
290+
public fun value ()J
291+
}
292+
293+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/GCHeapSummary : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event {
294+
public final field afterGC Z
295+
public final field committed J
296+
public final field gcId I
297+
public final field reserved J
298+
public final field used J
299+
public fun <init> (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrReader;)V
300+
}
301+
302+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/LiveObject : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event {
303+
public final field allocationSize J
304+
public final field allocationTime J
305+
public final field classId I
306+
public fun <init> (JIIIJJ)V
307+
public fun classId ()J
308+
public fun hashCode ()I
309+
public fun sameGroup (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;)Z
310+
public fun value ()J
311+
}
312+
313+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/MallocEvent : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event {
314+
public final field address J
315+
public final field size J
316+
public fun <init> (JIIJJ)V
317+
public fun value ()J
318+
}
319+
320+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/MallocLeakAggregator : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector {
321+
public fun <init> (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector;)V
322+
public fun afterChunk ()V
323+
public fun beforeChunk ()V
324+
public fun collect (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event;)V
325+
public fun finish ()Z
326+
public fun forEach (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/EventCollector$Visitor;)V
327+
}
328+
329+
public final class io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/ObjectCount : io/sentry/asyncprofiler/vendor/asyncprofiler/jfr/event/Event {
330+
public final field classId I
331+
public final field count J
332+
public final field gcId I
333+
public final field totalSize J
334+
public fun <init> (Lio/sentry/asyncprofiler/vendor/asyncprofiler/jfr/JfrReader;)V
335+
}
336+

0 commit comments

Comments
 (0)