Releases: SAP/async-profiler
Releases · SAP/async-profiler
Method tracing and system-wide process sampling
v4.2
Features
- Java Method Tracing and Latency Profiling
- async-profiler#1421: Latency profiling
- async-profiler#1435: Allow wildcards in Instrument profiling engine
- async-profiler#1499:
--traceoption with per-method latency threshold
- System-wide process sampling on Linux
- async-profiler#1411:
--procoption to recordprofiler.ProcessSampleevents
- async-profiler#1411:
- VMStructs stack walker by default
- async-profiler#1539: Use VMStructs stack walking mode by default
- async-profiler#1537: Support
comptaskandvtablefeatures - async-profiler#1517: Use JavaFrameAnchor to find top Java frame
- async-profiler#1449: Special handling of prologue and epilogue of compiled methods
Improvements
- async-profiler#1475: Add
CPUTimeSampleevent support to jfrconv - async-profiler#1414: Per-thread flamegraph option in JFR heatmap converter
- async-profiler#1526: Expose JfrReader dictionary that maps osThreadId to javaThreadId
- async-profiler#1448: Thread name in OpenTelemetry output
- async-profiler#1413: Add
time_nanosandduration_nanosto OTLP profiles - async-profiler#1450: Unwind dylib stubs as empty frames on macOS
- async-profiler#1416: Add synthetic symbols for Mach-O stubs/trampolines
- Allow cross-compilation for 32-bit platforms
Bug fixes
- async-profiler#1515: Fix UnsatisfiedLinkError when tmpdir is set to a relative path
- async-profiler#1500: Detect if
calloccallsmallocfor nativemem profiling - async-profiler#1427: Re-implement SafeAccess crash protection
- async-profiler#1417: Two wall-clock profilers interfere with each other
Project Infrastructure
- async-profiler#1527: GHA: replace macos-13 with macos-15-intel
- async-profiler#1510: Add option to retry tests
- async-profiler#1508: Add more GHA jobs to cover JDK versions on ARM
- async-profiler#1502: Fix job dependencies between integration tests and builds
- async-profiler#1466: Add Liberica JDK on Alpaquita Linux to the CI
- Made integration tests more stable overall
OpenTelemetry support and improved native memory profiler
v4.1
Features
- Experimental support for the OpenTelemetry profiling signal
- async-profiler#1188: OTLP output format and
dumpOtlpJava API - async-profiler#1336: JFR to OTLP converter
- async-profiler#1188: OTLP output format and
- JDK 25 support
- async-profiler#1222: Update VMStructs for JDK 25
- Productize native memory profiling
- async-profiler#1193: Full
nativememsupport on macOS - async-profiler#1254: Fixed Nativemem tests on Alpine
- async-profiler#1269: Native memory profiling now works with
jemalloc - async-profiler#1323:
nativememshows allocations inside async-profiler itself
- async-profiler#1193: Full
Improvements
- async-profiler#1174: Detect JVM in non-Java application and attach to it
- async-profiler#1223: Native API to add custom events in JFR recording
- async-profiler#1259:
--alloption to collect all possible events simultaneously - async-profiler#1286: Record which CPU a sample was taken on
- async-profiler#1299: Skip last 10% allocations for leak detection
- async-profiler#1300: Allow profiling kprobes/uprobes with
--fdtransfer - async-profiler#1366: Rewrite
jfrconvexecutable to shell - async-profiler#1400: Unwind checksum and digest intrinsics on ARM64
- async-profiler#1357, async-profiler#1389: VMStructs-based stack unwinding for
allocandnativememprofiling
Bug fixes
- async-profiler#1251:
--ttspoption does not work on Alpine - async-profiler#1264: Guard hook installation with dlopen/dlclose
- async-profiler#1319: SIGSEGV in PerfEvents::walk
- async-profiler#1350: Disable JFR OldObjectSample event in jfrsync mode
- async-profiler#1358: Do not dereference jmethodIDs on JDK 26
- async-profiler#1374: Correctly check if profiler is preloaded
- async-profiler#1380: Workaround clang type promotion bug
- async-profiler#1387: JFR writer crashes when using cstack=vmx
- async-profiler#1393: Improve stack walking termination logic: no endless
unknownframes - Stack unwinding fixes for ARM64
Project Infrastructure
- async-profiler#1129: Command-line option to filter tests
- async-profiler#1262: Include
asprof.hin async-profiler release package - async-profiler#1271: Release additional binaries with debug symbols
- async-profiler#1274: Add Corretto 8 to the test matrix
- async-profiler#1246, async-profiler#1226: Run tests on Amazon Linux and Alpine Linux
- async-profiler#1360: Auto-generated clang-tidy review comments
- async-profiler#1373: Save all generated test logs for debug purposes
- Fixed flaky tests (async-profiler#1282, async-profiler#1307, async-profiler#1376)
Heatmaps and Native memory profiling
v4.0
Features
- async-profiler#895, async-profiler#905:
jfrconvbinary and numerous converter enhancements - async-profiler#944: Interactive Heatmap
- async-profiler#1064: Native memory leak profiler
- async-profiler#1002: An option to display instruction addresses
- async-profiler#1007: Optimize wall clock profiling
- async-profiler#1073: Productize VMStructs-based stack walker:
--cstack vm/vmx - async-profiler#1169: C API for accessing thread-local profiling context
Improvements
- async-profiler#923: Support JDK 23+
- async-profiler#952: Solve musl and glibc compatibility issues; link
libstdc++statically - async-profiler#955:
--libpathoption to specify path tolibasyncProfiler.soin a container - async-profiler#1018:
--grainconverter option to coarsen flame graphs - async-profiler#1046:
--nostopoption to continue profiling outside--begin/--endwindow - async-profiler#1178:
--invertedoption to flip flame graphs vertically - async-profiler#1009: Allows collecting allocation and live object traces at the same time
- async-profiler#925: An option to accumulate JFR events in memory instead of flushing to a file
- async-profiler#929: Load symbols from debuginfod cache
- async-profiler#982: Sample contended locks by overflowing interval bucket
- async-profiler#993: Filter native frames in allocation profile
- async-profiler#896: FlameGraph:
Alt+Clickto remove stacks - async-profiler#1097: FlameGraph:
N/Shift+Nto navigate through search results - async-profiler#1182: Retain by-thread grouping when reversing FlameGraph
- async-profiler#1167: Log when no samples are collected
- async-profiler#1044: Fall back to
ctimerfor CPU profiling when perf_events are unavailable - async-profiler#1068: Count missed samples when estimating total CPU time in
ctimermode - async-profiler#1142: Use counter-timer register for timestamps on ARM64
- async-profiler#1123: Support
clock=tscwithout a JVM - async-profiler#1070: Demangle Rust v0 symbols
- async-profiler#1007: Use
ExecutionSampleevent for CPU profiling andWallClockSamplefor Wall clock profiling - async-profiler#1011: Obtain
can_generate_sampled_object_alloc_eventsJVMTI capability only when needed - async-profiler#1013: Intercept java.util.concurrent locks more efficiently
- async-profiler#759: Discover available profiling signal automatically
- async-profiler#884: Record event timestamps early
- async-profiler#885: Print error message if JVM fails to load libasyncProfiler
- async-profiler#892: Resolve tracepoint id in
asprof - Suppress dynamic attach warning on JDK 21+
Bug fixes
- async-profiler#1143: Crash on macOS when using thread filter
- async-profiler#1125: Fixed parsing concurrently loaded libraries
- async-profiler#1095: jfr print fails when a recording has empty pools
- async-profiler#1084: Fixed Logging related races
- async-profiler#1074: Parse both .rela.dyn and .rela.plt sections
- async-profiler#1003: Support both tracefs and debugfs for kernel tracepoints
- async-profiler#986: Profiling output respects loglevel
- async-profiler#981: Avoid JVM crash by deleting JNI refs after
GetMethodDeclaringClass - async-profiler#934: Fix crash on Zing in a native thread
- async-profiler#843: Fix race between parsing and concurrent unloading of shared libraries
- async-profiler#1147, async-profiler#1151: Deadlocks with jemalloc and tcmalloc profilers
- Stack walking fixes for ARM64
- Converter fixes for
jfrsyncprofiles - Fixed parsing non-PIC executables and shared objects with non-standard section layout
- Fixed recursion in
pthread_createwhen using native profiling API - Fixed crashes on Alpine when profiling native apps
- Fixed warnings with
-Xcheck:jni - Fixed "Unsupported JVM" on OpenJ9 JDK 21
- Fixed DefineClass crash on OpenJ9
- JfrReader should handle custom events properly
- Handle truncated JFRs
Project Infrastructure
- Restructure and update documentation
- Implement test framework; add new integration tests
- Unit test framework for C++ code
- Run CI on all supported platforms
- Test multiple JDK versions in CI
- Add GHA to validate license headers
- Add Markdown checker and formatter
- Add Issue and Pull Request templates
- Add Contributing Guidelines and Code of Conduct
- Run static analyzer and fix found issues (async-profiler#1034, async-profiler#1039, async-profiler#1049, async-profiler#1051, async-profiler#1098)
- Provide Dockerfile for building async-profiler release packages
- Publish nightly builds automatically
v3.0.2
Another SAP interim release that contains latest patches and works on JDK23.
v3.0.1
SAP interim release that works with JDK23.
Binary launcher and AsyncGetCallTrace replacement
v3.0
Features
- async-profiler#724: Binary launcher
asprof - async-profiler#751: Profile non-Java processes
- async-profiler#795: AsyncGetCallTrace replacement
- async-profiler#719: Classify execution samples into categories in JFR converter
- async-profiler#855:
ctimermode for accurate profiling without perf_events - async-profiler#740: Profile CPU + Wall clock together
- async-profiler#736: Show targets of vtable/itable calls
- async-profiler#777: Show JIT compilation task
- async-profiler#644: RISC-V port
- async-profiler#770: LoongArch64 port
Improvements
- async-profiler#733: Make the same
libasyncProfilerwork with both glibc and musl - async-profiler#734: Support raw PMU event descriptors
- async-profiler#759: Configure alternative profiling signal
- async-profiler#761: Parse dynamic linking structures
- async-profiler#723:
--clockoption to select JFR timestamp source - async-profiler#750:
--jfrsyncmay specify a list of JFR events - async-profiler#849: Parse concatenated multi-chunk JFRs
- async-profiler#833: Time-to-safepoint JFR event
- async-profiler#832: Normalize names of hidden classes / lambdas
- async-profiler#864: Reduce size of HTML Flame Graph
- async-profiler#783: Shutdown asprof gracefully on SIGTERM
- Better demangling of C++ and Rust symbols
- DWARF unwinding for ARM64
JfrReadercan parse in-memory buffer- Support custom events in
JfrReader - An option to read JFR file by chunks
- Record
GCHeapSummaryevents in JFR
Bug fixes
- Workaround macOS crashes in SafeFetch
- Fixed attach to OpenJ9 on macOS
- Support
UseCompressedObjectHeadersaka Lilliput - Fixed allocation profiling on JDK 20.0.x
- Fixed context-switches profiling
- Prefer ObjectSampler to TLAB hooks for allocation profiling
- Improved accuracy of ObjectSampler in
--totalmode - Make Flame Graph status line and search results always visible
loopandtimeoutoptions did not work in some modes- Restart interrupted poll/epoll_wait syscalls
- Fixed stack unwinding issues on ARM64
- Workaround for stale jmethodIDs
- Calculate ELF base address correctly
- Do not dump redundant threads in a JFR chunk
checkaction prints result to a file- Annotate JFR unit types with
@ContentType
Maintenance release
v2.5.1
Bug fixes
- Prevent early unloading of libasyncProfiler.so
- Read kernel symbols only for perf_events
- Escape backslashes in flame graphs
- Avoid duplicate categories in
jfrsyncmode - Fixed stack overflow in RedefineClasses
- Fixed deadlock when flushing JFR
Improvements
- Support OpenJDK C++ Interpreter (aka Zero)
- Allow reading incomplete JFR recordings
macOS/ARM64 port and many JFR improvements
v2.5
Features
- macOS/ARM64 (aka Apple M1) port
- PPC64LE port (contributed by @ghaug)
- Profile low-privileged processes with perf_events (contributed by @Jongy)
- Raw PMU events; kprobes & uprobes
- Dump results in the middle of profiling session
- Chunked JFR; support JFR files larger than 2 GB
- Integrate async-profiler events with JDK Flight Recordings
Improvements
- Use RDTSC for JFR timestamps when possible
- Show line numbers and bci in Flame Graphs
- jfr2flame can produce Allocation and Lock flame graphs
- Flame Graph title depends on the event and
--total - Include profiler logs and native library list in JFR output
- Lock profiling no longer requires JVM symbols
- Better container support
- Native function profiler can count the specified argument
- An option to group threads by scheduling policy
- An option to prepend library name to native symbols
Notes
- macOS build is provided as a fat binary that works both on x86-64 and ARM64
- 32-bit binaries are no longer shipped. It is still possible to build them from sources
- Dropped JDK 6 support (may still work though)
Maintenance release
v1.8.7
Bug fixes
- Workaround for JDK-8173361
- Backported fix for "Accept timed out" exception
Maintenance release
v1.8.6
Improvements
log=noneoption to suppress warnings about missing JVM symbols- Sign macOS binaries
Bug fixes
- Workaround for JDK-8212160