我想从我的 Java 应用程序中收集堆栈跟踪来创建CPU 火焰图 http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html用于分析。
这与这个问题非常相似:如何从每个示例中的分析器中获取完整的堆栈转储以用于火焰图? https://stackoverflow.com/questions/10333376/how-to-get-complete-stack-dump-from-profiler-in-every-sample-for-use-in-flame-gr有 2 个区别:
- 我使用 Java 代码并且需要 Java 堆栈跟踪
- 我正在 Mac 上工作(这意味着没有
pref
据我所知dtrace
OSX 上不支持jstack
扩大)。
我已经尝试过了轻量级 java-profiler https://code.google.com/p/lightweight-java-profiler/ and 诚实的剖析师 https://github.com/RichardWarburton/honest-profiler,而且这两个似乎都不能在 Mac 上运行。我也尝试过VisualVM http://visualvm.java.net,但我无法让它生成我需要的堆栈跟踪转储。
对我来说,首要任务是从 Java 堆栈跟踪生成火焰图,但是拥有本机调用堆栈也很棒,因为它可以让我解决 I/O 问题(甚至可能生成热/冷火焰图 http://www.brendangregg.com/FlameGraphs/hotcoldflamegraphs.html).
好消息,FlameGraph 存储库有一个“脚本”可以与其中已有的 jstacks 一起使用。
https://github.com/brendangregg/FlameGraph 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进程生成堆栈,请参阅自述文件https://github.com/brendangregg/FlameGraph https://github.com/brendangregg/FlameGraph
例如,这可能包括更多本机调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)