美文网首页
Java Mission Control之飞行记录器JFR(Ja

Java Mission Control之飞行记录器JFR(Ja

作者: 天草二十六_简村人 | 来源:发表于2019-12-11 15:18 被阅读0次

    一、找到你的java进程

    ~/Documents$ jps
    Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
    12786 Main
    31187 Jps
    26196 TagServiceApplication
    23284 org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
    26197 Launcher
    30527 RemoteMavenServer
    

    26196 就是你的应用进程ID了

    二、由于JFR需要JDK的商业证书,第二步需要解锁jdk的商业特性

    ~$ jcmd 26196 VM.unlock_commercial_features
    Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
    26196:
    Commercial Features already unlocked.
    

    三、JVM参数调整

    JDK是1.8u44以上. 不需要配置参数;
    JDK是1.8以下, 需要配置: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder

    四、远程连接JVM

    (通过JMX连接如果想要用jmc监控远程的JVM进程,配置方式和jvisualvm方式一一样即可)

    首先,远程机器被监控的程序需要开启调试端口,在执行java命令行中加入以下属性,属性没有以ssl安全认证方式连接的,启动监听端口为7091

    -Dcom.sun.management.jmxremote=true 
    -Djava.rmi.server.hostname=192.168.5.78 (被远程JVM服务的IP,注意不是本地的IP)
    -Dcom.sun.management.jmxremote.port=7091 
    -Dcom.sun.management.jmxremote.authenticate=false 
    -Dcom.sun.management.jmxremote.ssl=false 
    -XX:+UnlockCommercialFeatures
    -XX:+FlightRecorder
    
    image.png
    image.png
    image.png

    五、飞行记录器的内容介绍

    1、概要

    主要关注堆使用量、CPU使用率、GC暂停时间。见下图中的三个仪表盘。


    image.png

    用户态进程占据了较多的cpu,cpu总体使用率最大值为100%

    2、内存

    2.1 概要

    image.png

    2.2 垃圾收集

    image.png

    对象的引用情况:


    image.png

    2.3 GC时间

    image.png

    2.4 GC配置

    主要是说明使用的垃圾收集器,以及堆的配置。


    image.png

    2.5 内存分配

    image.png
    按线程分析TLAB的分配情况
    image.png
    按线程分析TLAB外部的分配情况
    image.png
    关于TLAB,参考文章https://www.jianshu.com/p/8be816cbb5ed,讲述得很详细了。
    TLAB的全称是Thread Local Allocation Buffer,即线程本地分配缓存区,这是一个线程专用的内存分配区域。
    
    如果设置了虚拟机参数 -XX:UseTLAB,在线程初始化时,同时也会申请一块指定大小的内存,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在竞争的情况,可以大大提升分配效率。
    
    TLAB空间的内存非常小,缺省情况下仅占有整个Eden空间的1%,也可以通过选项-XX:TLABWasteTargetPercent设置TLAB空间所占用Eden空间的百分比大小。
    
    TLAB的本质其实是三个指针管理的区域:start,top 和 end,每个线程都会从Eden分配一块空间,例如说100KB,作为自己的TLAB,其中 start 和 end 是占位用的,标识出 eden 里被这个 TLAB 所管理的区域,卡住eden里的一块空间不让其它线程来这里分配。
    
    TLAB只是让每个线程有私有的分配指针,但底下存对象的内存空间还是给所有线程访问的,只是其它线程无法在这个区域分配而已。从这一点看,它被翻译为 “线程私有分配区” 更为合理一点。
    当一个TLAB用满(分配指针top撞上分配极限end了),就新申请一个TLAB,而在老TLAB里的对象还留在原地什么都不用管——它们无法感知自己是否是曾经从TLAB分配出来的,而只关心自己是在eden里分配的。
    

    3、代码

    热点方法,调用树,异常错误,编译,类加载


    image.png

    4、线程

    4.1 概要

    image.png

    4.2 热点线程

    image.png

    4.3 线程的等待时间

    image.png

    4.4 线程转储

    10分钟内,因为设置的是60s一次转储,所以共有10次转储记录


    image.png

    相关文章

      网友评论

          本文标题:Java Mission Control之飞行记录器JFR(Ja

          本文链接:https://www.haomeiwen.com/subject/dhmogctx.html