• Jcmd 分析jvm虚拟机并解析jfr文件


    Jcmd 分析jvm虚拟机

    在JDK 1.7之后,新增了一个命令行工具jcmd。它是一个多功能工具,可以用来导出堆,查看java进程,导出线程信息,执行GC等。

    开启JFR需要三步:

    • 创建一个包含了你自己配置的JFR模板文件。运行 jmc, 然后 窗口→飞行记录模板管理 菜单。准备好档案后,就可以导出文件,并移动到要排查问题的环境中。

     

    • 由于JFR需要JDK的商业证书,这一步需要解锁jdk的商业特性。

    jcmd <PID> VM.unlock_commercial_features

     

    • 启动jcmd

           以demo应用为例:

          

    jcmd <PID> JFR.start name=test1 duration=10s settings=template filename=output1.jfr

       

    收集完监控数据后用jmc打开

     

     

    UI界面展示:

     

     

    output1.jfr是一个二进制文件,下面讲下如何用脚本分析.

     

    分析output1.jfr 需要用到https://github.com/chrishantha/jfr-flame-graph

    install-mc-jars.sh

    mvn clean install -U

    git clone https://github.com/brendangregg/FlameGraph.git

    export FLAMEGRAPH_DIR=/path/to/FlameGraph

     

    通过以下命令转换成可识别的数据文件

    火焰图

    ./create_flamegraph.sh -f recording_13801_1.jfr -i > flamegraph.svg

     

    转为json串

    ./flamegraph-output.sh json -f recording_13801_1.jfr > resource.json

    对json串进行递归分析后可以获得如下数据,key表示具体的函数名,value表示该函数的执行次数样本统计:

     

     

    用代码可以解析出来

     

     

     

    ==================================================================
    [boolean com.oracle.jrockit.jfr.EventToken.isEnabled(), void java.io.FileOutputStream.write(byte[], int, int), void java.io.BufferedOutputStream.flushBuffer(), void java.io.BufferedOutputStream.flush(), void java.io.PrintStream.write(byte[], int, int), void sun.nio.cs.StreamEncoder.writeBytes(), void sun.nio.cs.StreamEncoder.implFlushBuffer(), void sun.nio.cs.StreamEncoder.flushBuffer(), void java.io.OutputStreamWriter.flushBuffer(), void java.io.PrintStream.write(java.lang.String), void java.io.PrintStream.print(java.lang.String), void java.io.PrintStream.println(java.lang.String), void abcount.S2(), void abcount.main(java.lang.String[])]
    void abcount.main(java.lang.String[])
    void abcount.S2()
    void java.io.PrintStream.println(java.lang.String)
    void java.io.PrintStream.print(java.lang.String)
    void java.io.PrintStream.write(java.lang.String)
    void java.io.OutputStreamWriter.flushBuffer()
    void sun.nio.cs.StreamEncoder.flushBuffer()
    void sun.nio.cs.StreamEncoder.implFlushBuffer()
    void sun.nio.cs.StreamEncoder.writeBytes()
    void java.io.PrintStream.write(byte[], int, int)
    void java.io.BufferedOutputStream.flush()
    void java.io.BufferedOutputStream.flushBuffer()
    void java.io.FileOutputStream.write(byte[], int, int)
    boolean com.oracle.jrockit.jfr.EventToken.isEnabled()
    ==================================================================
    [void java.io.BufferedOutputStream.write(byte[], int, int), void java.io.PrintStream.write(byte[], int, int), void sun.nio.cs.StreamEncoder.writeBytes(), void sun.nio.cs.StreamEncoder.implFlushBuffer(), void sun.nio.cs.StreamEncoder.flushBuffer(), void java.io.OutputStreamWriter.flushBuffer(), void java.io.PrintStream.write(java.lang.String), void java.io.PrintStream.print(java.lang.String), void java.io.PrintStream.println(java.lang.String), void abcount.S2(), void abcount.main(java.lang.String[])]
    void abcount.main(java.lang.String[])
    void abcount.S2()
    void java.io.PrintStream.println(java.lang.String)
    void java.io.PrintStream.print(java.lang.String)
    void java.io.PrintStream.write(java.lang.String)
    void java.io.OutputStreamWriter.flushBuffer()
    void sun.nio.cs.StreamEncoder.flushBuffer()
    void sun.nio.cs.StreamEncoder.implFlushBuffer()
    void sun.nio.cs.StreamEncoder.writeBytes()
    void java.io.PrintStream.write(byte[], int, int)
    void java.io.BufferedOutputStream.write(byte[], int, int)
    ==================================================================
    [void sun.nio.cs.StreamEncoder.flushBuffer(), void java.io.OutputStreamWriter.flushBuffer(), void java.io.PrintStream.newLine(), void java.io.PrintStream.println(java.lang.String), void abcount.S2(), void abcount.main(java.lang.String[])]
    void abcount.main(java.lang.String[])
    void abcount.S2()
    void java.io.PrintStream.println(java.lang.String)
    void java.io.PrintStream.newLine()
    void java.io.OutputStreamWriter.flushBuffer()
    void sun.nio.cs.StreamEncoder.flushBuffer()
    ==================================================================
    [void java.io.FileOutputStream.write(byte[], int, int), void java.io.BufferedOutputStream.flushBuffer(), void java.io.BufferedOutputStream.flush(), void java.io.PrintStream.write(byte[], int, int), void sun.nio.cs.StreamEncoder.writeBytes(), void sun.nio.cs.StreamEncoder.implFlushBuffer(), void sun.nio.cs.StreamEncoder.flushBuffer(), void java.io.OutputStreamWriter.flushBuffer(), void java.io.PrintStream.write(java.lang.String), void java.io.PrintStream.print(java.lang.String), void java.io.PrintStream.println(java.lang.String), void abcount.S2(), void abcount.main(java.lang.String[])]
    void abcount.main(java.lang.String[])
    void abcount.S2()
    void java.io.PrintStream.println(java.lang.String)
    void java.io.PrintStream.print(java.lang.String)
    void java.io.PrintStream.write(java.lang.String)
    void java.io.OutputStreamWriter.flushBuffer()
    void sun.nio.cs.StreamEncoder.flushBuffer()
    void sun.nio.cs.StreamEncoder.implFlushBuffer()
    void sun.nio.cs.StreamEncoder.writeBytes()
    void java.io.PrintStream.write(byte[], int, int)
    void java.io.BufferedOutputStream.flush()
    void java.io.BufferedOutputStream.flushBuffer()
    void java.io.FileOutputStream.write(byte[], int, int)
    ==================================================================
    [void java.io.FileOutputStream.write(byte[], int, int), void java.io.BufferedOutputStream.flushBuffer(), void java.io.BufferedOutputStream.flush(), void java.io.PrintStream.write(byte[], int, int), void sun.nio.cs.StreamEncoder.writeBytes(), void sun.nio.cs.StreamEncoder.implFlushBuffer(), void sun.nio.cs.StreamEncoder.flushBuffer(), void java.io.OutputStreamWriter.flushBuffer(), void java.io.PrintStream.newLine(), void java.io.PrintStream.println(java.lang.String), void abcount.S2(), void abcount.main(java.lang.String[])]
    void abcount.main(java.lang.String[])
    void abcount.S2()
    void java.io.PrintStream.println(java.lang.String)
    void java.io.PrintStream.newLine()
    void java.io.OutputStreamWriter.flushBuffer()
    void sun.nio.cs.StreamEncoder.flushBuffer()
    void sun.nio.cs.StreamEncoder.implFlushBuffer()
    void sun.nio.cs.StreamEncoder.writeBytes()
    void java.io.PrintStream.write(byte[], int, int)
    void java.io.BufferedOutputStream.flush()
    void java.io.BufferedOutputStream.flushBuffer()
    void java.io.FileOutputStream.write(byte[], int, int)
    JFR Details
    Start : 2017年4月13日 下午06时13分38秒
    End : 2017年4月13日 下午06时13分49秒
    Min Start Event : 2262年4月12日 上午07时47分16秒
    Max End Event : 1970年1月1日 上午08时00分00秒
    JFR Duration : 0 h 0 min
    Events Duration : -2,562,047 h -47 min
    Fount 1867 events

     

     

     

     

  • 相关阅读:
    away3d 4.1 alpha 教程 换装篇 <3> 人物动态换装DEMO
    书本资料汇总
    洪小瑶学IOS(一):准备起航 <ObjectiveC基础教程>笔记
    Flex 4 权威指南 学习笔记
    通过存储过程建立灵活的SQL计划任务
    javascript 未结束的字符串常量
    SQL重复记录查询
    重置数据库自增字段
    C#获取周一、周日的日期 函数类
    C# ,ASP.NET,Winform将数据导出到Execl汇总
  • 原文地址:https://www.cnblogs.com/chanlengr/p/6705489.html
Copyright © 2020-2023  润新知