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

2019-12-11  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读