java - 如何获取用于在 Mac 上创建火焰图的 Java 分析转储?

标签 java profiling visualization stack-trace

我想从我的 Java 应用程序中收集堆栈跟踪以创建 CPU Flame Graphs用于分析。

这与这个问题非常相似:How to get complete stack dump from profiler in every sample for use in flame graph?有两个区别:

  1. 我使用 Java 代码,我需要 Java 堆栈跟踪
  2. 我在 Mac 上工作(这意味着没有 pref 并且 OSX 上的 AFAIK dtrace 不支持 jstack 扩展)。

我已经试过了lightweight-java-profilerHonest profiler ,而且它们似乎都不适用于 Mac。我也试过VisualVM ,但我无法让它生成我需要的堆栈跟踪转储。

对我来说,首要任务是从 Java 堆栈跟踪生成火焰图,但如果拥有 native 调用堆栈也很棒,因为它可以让我解决 I/O 问题(甚至可能生成 hot/cold flame graphs)。

最佳答案

好消息,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 进程生成堆栈,请参阅自述文件 https://github.com/brendangregg/FlameGraph

例如,这可能包括更多 native 调用。

关于java - 如何获取用于在 Mac 上创建火焰图的 Java 分析转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27228972/

相关文章:

javaws.exe 与 java8 中的 java.exe 相比性能较差

unix - 使用/usr/bin/time 时如何忽略程序的输出?

javascript - 如何更改 infovis spacetree 中的默认方向?

r - geom_point : Put overlapping points with highest values on top of others

java - Gmail API : Credentials for Gmail API

java - JAX-WS,日期时区被误解

java - Ibatis绑定(bind)异常错误信息

javascript - 我可以查看 Chrome 分析数据的火焰图吗?

java - 在 "Enterprise"中使用 Django 的任何人

python - 具有扭曲色彩图的 3D 绘图