IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Java 应用在线性能分析和火焰图

    神仙发表于 2016-08-29 11:44:00
    love 0

    在碰到线上性能问题的时候,如果能在线通过采样方式获取热点函数/方法就可以更方便地定位问题所在,进行优化。Linux 平台上,对于多数 C/C++ 编写的应用,可以通过 perf 来方便的采样,还可以进一步生成火焰图来更直观地观察。Java 是没法直接用 perf 的。虽然有一个 perf-map-agent,但是并不方便,尝试过程中还弄出了 kernel panic,所以这玩意是不敢在线上用了。不过 JDK 自己其实已经带了一个采样工具 FlightRecorder ,算是 JMC 的一部分。这个功能是商业版本的功能,虽说启用的时候并没检查 license,但是理论上要在生产环境用,还是要花钱的。

    首先,应用启动的时候,要给 java 加上参数:

    -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=loglevel=info

    然后在想开始采样的时候

    sudo -u  -i jcmd  JFR.start filename=/tmp/app.jfr duration=60s

    这里可以指定输出的文件路径,和采样时间。

    之后可以用

    sudo -u  -i jcmd  JFR.check

    来检查采样是不是已经完成了。确认完成后,就可以把 jfr 文件传回本地,用 jmc 来分析了。如果想要生成火焰图,还有这么个工具:https://github.com/chrishantha/jfr-flame-graph。具体用法可以看文档。大致上,代码拖回来后,

    cd jfr-flame-graph
    install-mc-jars.sh
    mvn clean install -U
    

    就编译好了。另外还需要 https://github.com/brendangregg/FlameGraph

    工具准备好以后,

    path/to/jfr-flame-graph/run.sh -f app.jfr -o app.txt
    cat app.txt | path/to/FlameGraph/flamegraph.pl >app.svg
    

    就能生成一个漂亮的火焰图了。



沪ICP备19023445号-2号
友情链接