如何获得Java配置文件转储创建火焰图在mac上?

kkbh8khc  于 2022-12-21  发布在  Java
关注(0)|答案(5)|浏览(170)

我想从Java应用程序中收集堆栈跟踪,以创建用于性能分析的CPU Flame Graphs
这与下面这个问题非常相似:How to get complete stack dump from profiler in every sample for use in flame graph?,有2个不同之处:
1.我使用Java代码,需要Java堆栈跟踪
1.我在Mac上工作(这意味着没有pref,OSX上的AFAIK dtrace不支持jstack扩展)。
我已经试过lightweight-java-profilerHonest profiler,它们似乎都不能在Mac上工作。我也试过VisualVM,但我不能让它产生我需要的堆栈跟踪转储。
我的首要任务是从Java stacktrace生成火焰图,但如果也有本机调用堆栈就更好了,因为它可以让我解决I/O问题(甚至可能生成hot/cold flame graphs)。

rn0zuynd

rn0zuynd1#

好消息是,FlameGraph存储库中已经有了与jstacks一起使用的“脚本”。
https://github.com/brendangregg/FlameGraph
stackcollapse-jstack.pl
在默认情况下,它似乎只期望在其输入中有一个又一个堆栈跟踪,并将每个堆栈跟踪计数为“一个采样点”。
因此,您可以在一个文件中执行多个jstack(运行一次或几次,或每秒运行一次“一段时间”等):
jstack pid_of_your_jvm >> my_jstack
然后执行该脚本:

./stackcollapse-jstack.pl my_jstack > my_jstack.folded

最后转换成火焰图:

./flamegraph.pl --color=java my_jstack.folded > my_jstack.svg

不需要第三方帮助(尽管他们可能仍然有用)。
还要注意的是stackcollapse-jstack.pl文件丢弃了非RUNNABLE线程,如果你还想包含“空闲”线程(通常你不想),你可能需要调整它。
显然,您也可以使用linux“perf”命令为java进程生成堆栈,请参阅READMEhttps://github.com/brendangregg/FlameGraph
例如,这可能包括更多的本机调用。

axkjgtzd

axkjgtzd2#

我根据@cello的答案创建了两个shell脚本,它们生成hot/cold flame graphs
this Gist获取它们。
用法:

ps ax | grep java # find the PID of your process
./profile.sh 20402 stacks.txt
./gen.sh stacks.txt

或者,为了从启动开始测量应用程序(在本例中,我的gradle构建也需要在另一个目录中运行,并使用一些输入流),我使用了:

cd ../my-project; ./gradlew --no-daemon clean build < /dev/zero &; cd -; ./profile.sh $! stacks.txt
./gen.sh stacks.txt

结果:

在这个例子中,我可以清楚地看到我的应用程序是I/O绑定的(注意顶部的蓝条)。

agxfikkp

agxfikkp3#

试试这个:https://github.com/saquibkhan/javaFlameGraph

安装

第一个月

用法

  1. cd javaflamegraph
  2. npm start-这将等待直到它检测到一个名为'Java'的进程。最好在程序启动时开始分析。
  3. npm run start <process id>-这将启动给定进程ID的性能分析,例如npm run start 1234
tpxzln5u

tpxzln5u4#

您是否尝试了jstack命令?只需在命令行上运行该命令:jstack pidOfJavaProcess > stack.txt(当然,用实际的进程号替换pidOfJavaProcess)。您可以在bash(Mac OS X上使用的默认shell)中的循环中运行此命令:

while true; do jstack pidOfJavaProcess >> stack.txt; sleep 1.0; done

注意要附加到文件的>>,不要每秒覆盖它。2按Ctrl+C停止记录堆栈跟踪。
这只会生成Java堆栈跟踪,而不会生成JVM的本机调用堆栈。

vxf3dgd4

vxf3dgd45#

安装火焰分析仪

$ wget https://raw.githubusercontent.com/brendangregg/FlameGraph/master/flamegraph.pl
$ wget https://raw.githubusercontent.com/brendangregg/FlameGraph/master/stackcollapse-jstack.pl
$ chmod +x *.pl
# Copy those Perl scripts into the PATH location

收集正在运行的java应用程序的堆栈跟踪

# Run multiple times (in loop) to get more samples
$ jcmd <Java Pid> Thread.print >> jcmd.tdump

生成火焰图

$ stackcollapse-jstack.pl jcmd.tdump > jcmd.tdump.folded
$ flamegraph.pl --color=io --title "Thread Dump" --countname "Samples" --width 1080 jcmd.tdump.folded > jcmd.tdump.svg

相关问题