如何从头到尾分析一个 Java 程序 运行?

How to profile a Java program run from start to finish?

我有一个只运行大约 20-30 秒的 Java 程序,我想分析它。

每次启动时手动启动 jvisualvm 探查器是不可靠的,因为您在操作 UI.

时会损失几秒钟

有没有办法分析整个执行过程,就像旧的 -Xhprof:cpu=samples 不再有效?

使用 Flight Recorder 可以添加到命令行

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder 
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,settings=profile

https://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/run.htm#JFRRT176

它只记录新TLAB上的内存分配,所以我让它比默认值小很多以获得更多样本。

-XX:TLABSize=128k

您需要从 $JAVA_HOME/bin 目录 运行 jmc 打开创建的 .jfr 文件。

我发现它比 VisualVM 更难使用,但产生的结果更详细,噪音更小。也就是说,分析器本身导致的分配要少得多。