ap-loader v10
- Drop support for async-profiler < 4.0 versions, as 4.0 changed how its tested
- Major changes in the usage of the JFR conversion made by async-profiler
which are not hidden - Clean up the code
The following is copied from the wrapped async-profiler release by Andrei Pangin. The source code linked below should be ignored.
v4.0
Features
- #895, #905:
jfrconv
binary and numerous converter enhancements - #944: Interactive Heatmap
- #1064: Native memory leak profiler
- #1002: An option to display instruction addresses
- #1007: Optimize wall clock profiling
- #1073: Productize VMStructs-based stack walker:
--cstack vm/vmx
- #1169: C API for accessing thread-local profiling context
Improvements
- #923: Support JDK 23+
- #952: Solve musl and glibc compatibility issues; link
libstdc++
statically - #955:
--libpath
option to specify path tolibasyncProfiler.so
in a container - #1018:
--grain
converter option to coarsen flame graphs - #1046:
--nostop
option to continue profiling outside--begin
/--end
window - #1178:
--inverted
option to flip flame graphs vertically - #1009: Allows collecting allocation and live object traces at the same time
- #925: An option to accumulate JFR events in memory instead of flushing to a file
- #929: Load symbols from debuginfod cache
- #982: Sample contended locks by overflowing interval bucket
- #993: Filter native frames in allocation profile
- #896: FlameGraph:
Alt+Click
to remove stacks - #1097: FlameGraph:
N
/Shift+N
to navigate through search results - #1182: Retain by-thread grouping when reversing FlameGraph
- #1167: Log when no samples are collected
- #1044: Fall back to
ctimer
for CPU profiling when perf_events are unavailable - #1068: Count missed samples when estimating total CPU time in
ctimer
mode - #1142: Use counter-timer register for timestamps on ARM64
- #1123: Support
clock=tsc
without a JVM - #1070: Demangle Rust v0 symbols
- #1007: Use
ExecutionSample
event for CPU profiling andWallClockSample
for Wall clock profiling - #1011: Obtain
can_generate_sampled_object_alloc_events
JVMTI capability only when needed - #1013: Intercept java.util.concurrent locks more efficiently
- #759: Discover available profiling signal automatically
- #884: Record event timestamps early
- #885: Print error message if JVM fails to load libasyncProfiler
- #892: Resolve tracepoint id in
asprof
- Suppress dynamic attach warning on JDK 21+
Bug fixes
- #1143: Crash on macOS when using thread filter
- #1125: Fixed parsing concurrently loaded libraries
- #1095: jfr print fails when a recording has empty pools
- #1084: Fixed Logging related races
- #1074: Parse both .rela.dyn and .rela.plt sections
- #1003: Support both tracefs and debugfs for kernel tracepoints
- #986: Profiling output respects loglevel
- #981: Avoid JVM crash by deleting JNI refs after
GetMethodDeclaringClass
- #934: Fix crash on Zing in a native thread
- #843: Fix race between parsing and concurrent unloading of shared libraries
- #1147, #1151: Deadlocks with jemalloc and tcmalloc profilers
- Stack walking fixes for ARM64
- Converter fixes for
jfrsync
profiles - Fixed parsing non-PIC executables and shared objects with non-standard section layout
- Fixed recursion in
pthread_create
when 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 (#1034, #1039, #1049, #1051, #1098)
- Provide Dockerfile for building async-profiler release packages
- Publish nightly builds automatically