我想从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-profiler和Honest profiler,它们似乎都不能在Mac上工作。我也试过VisualVM,但我不能让它产生我需要的堆栈跟踪转储。
我的首要任务是从Java stacktrace生成火焰图,但如果也有本机调用堆栈就更好了,因为它可以让我解决I/O问题(甚至可能生成hot/cold flame graphs)。
5条答案
按热度按时间rn0zuynd1#
好消息是,FlameGraph存储库中已经有了与jstacks一起使用的“脚本”。
https://github.com/brendangregg/FlameGraph
是
stackcollapse-jstack.pl
。在默认情况下,它似乎只期望在其输入中有一个又一个堆栈跟踪,并将每个堆栈跟踪计数为“一个采样点”。
因此,您可以在一个文件中执行多个jstack(运行一次或几次,或每秒运行一次“一段时间”等):
jstack pid_of_your_jvm >> my_jstack
然后执行该脚本:
最后转换成火焰图:
不需要第三方帮助(尽管他们可能仍然有用)。
还要注意的是
stackcollapse-jstack.pl
文件丢弃了非RUNNABLE线程,如果你还想包含“空闲”线程(通常你不想),你可能需要调整它。显然,您也可以使用linux“perf”命令为java进程生成堆栈,请参阅READMEhttps://github.com/brendangregg/FlameGraph
例如,这可能包括更多的本机调用。
axkjgtzd2#
我根据@cello的答案创建了两个shell脚本,它们生成hot/cold flame graphs。
从this Gist获取它们。
用法:
或者,为了从启动开始测量应用程序(在本例中,我的gradle构建也需要在另一个目录中运行,并使用一些输入流),我使用了:
结果:
在这个例子中,我可以清楚地看到我的应用程序是I/O绑定的(注意顶部的蓝条)。
agxfikkp3#
试试这个:https://github.com/saquibkhan/javaFlameGraph
安装
第一个月
用法
cd javaflamegraph
npm start
-这将等待直到它检测到一个名为'Java'的进程。最好在程序启动时开始分析。npm run start <process id>
-这将启动给定进程ID的性能分析,例如npm run start 1234
tpxzln5u4#
您是否尝试了
jstack
命令?只需在命令行上运行该命令:jstack pidOfJavaProcess > stack.txt
(当然,用实际的进程号替换pidOfJavaProcess)。您可以在bash(Mac OS X上使用的默认shell)中的循环中运行此命令:注意要附加到文件的
>>
,不要每秒覆盖它。2按Ctrl+C
停止记录堆栈跟踪。这只会生成Java堆栈跟踪,而不会生成JVM的本机调用堆栈。
vxf3dgd45#
安装火焰分析仪
收集正在运行的java应用程序的堆栈跟踪
生成火焰图