If you need to profile some code as soon as the JVM starts up, instead of using asprof
,
it is possible to attach async-profiler as an agent on the command line. For example:
$ java -agentpath:/path/to/libasyncProfiler.so=start,event=cpu,file=profile.html ...
Agent library is configured through the JVMTI argument interface.
The format of the arguments string is described
in the source code.
asprof
actually converts command line arguments to that format.
Another important use of attaching async-profiler as an agent is for continuous profiling.
async-profiler can be controlled programmatically using Java API. The corresponding Java library is published to Maven Central. You can include it just like any other Maven dependency:
<dependency>
<groupId>tools.profiler</groupId>
<artifactId>async-profiler</artifactId>
<version>X.Y</version>
</dependency>
AsyncProfiler profiler = AsyncProfiler.getInstance();
The above gives us an instance of AsyncProfiler
object which can be further used to start
actual profiling.
profiler.execute("start,jfr,event=cpu,file=/path/to/%p.jfr");
// do some meaningful work
profiler.execute("stop");
%p
equates to the PID of the process. Filename may include other placeholders which
can be found in Profiler Options.
file
should be specified only once, either in
start
command with jfr
output or in stop
command with any other format.
Intellij IDEA comes bundled with async-profiler, which can be further configured to our needs
by selecting the Java Profiler
menu option at Settings/Preferences > Build, Execution, Deployment
.
Agent options can be modified for the specific use cases and also Collect native calls
can be checked
to monitor non-java threads and native frames in Java stack traces.