一、找到你的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.png2.2 垃圾收集
image.png对象的引用情况:
image.png
2.3 GC时间
image.png2.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.png4.2 热点线程
image.png4.3 线程的等待时间
image.png4.4 线程转储
10分钟内,因为设置的是60s一次转储,所以共有10次转储记录
image.png
网友评论