JVM知识专栏JVM-火种,持续更新,喜欢请关注😍
系统性能监控
linux下的使用命令进行监控系统性能
pidstat
使用sudo apt-get install sysstat命令安装该工具(centos下使用 sudo yum install sysstat命令).pidstat可以监控到每个应用cpu使用率、io使用率、内存使用率。
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
想针对具体的一个应用排查它的性能情况,可以先使用ps -ef | grep java 找到对应应用的进程号
根据进程号查看进程cpu占用情况
pidstat -p 12694 -u 1 3
// -p:指定进程号、12694:进程号、-u:统计cpu情况、1:没一秒统计一次、3:共统计3次,如果最后一个参数不写会一直统计,ctrl+C结束统计
命令运行结果表示当前进程在三次统计中,cpu占有率分别是1%、0%、1%,平均cpu占有为0.67%,这三次输出时这个应用都是运行在系统的第三颗cpu上。
根据进程号查看进程对应线程cpu占用情况
pidstat -p 24886 -u 1 1 -t
// -t:查看线程情况
假如有某个线程的cpu占用率特别高,我们就可以排查这个线程引起占用率高的原因。
根据进程号查看进程对应线程IO使用情况
pidstat -p 24886 -d 1 1 -t
//-d:查看io情况
PID:进程id
kB_rd/s:每秒从磁盘读取的KB
kB_wr/s:每秒写入磁盘KB
kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
COMMAND:task的命令名
JDK自带工具的使用
jps
jps [options] [hostid]
jps的使用格式为jps+参数,参数-q:只输出进程号,省略主类的名称、-v:输出虚拟机启动时的JVM参数。jps -v打印结果如下
表明进程号为18723,应用类型为jar,JVM参数若干、gc收集地址/usr/solr-7.5.0/server/logs/solr_gc.log,端口号、应用位置等。tomcat使用未被显式指定的默认JVM参数时,输出信息不会包含JVM相关参数。
jinfo
jinfo [options] pid
jinfo也可以打印虚拟机启动的参数详情,与jps不同的是它可以打印出未被显式指定的默认JVM参数
jinfo -flags 28459
指定了进程号为28456的JVM参数详情。
jinfo -flag MaxTenuringThreshold 2972
显示了新生代对象晋升到老年代对象的最大年龄。
jmap
jmap用于生成对存储快照,格式为:
jmap [option] vmid
生成Java应用程序的堆快照和对象的统计信息
jmap -histo 28459 > /mnt/TFS/abc.text
命令表示打印进程号为28459的信息到 /mnt/TFS/abc.text文件。占用内存较多的[B、[C、[I分别表示[C : char[]、[I:int[]、[B:byte[] 。
jmap -dump:format=b,file=/mnt/TFS/heap.hprof 28459
Dump出的堆信息可以在MAT或者Visual VM工具进行分析。
jstack
jstack用于生成虚拟机当前时刻的线程快照(threaddump),可以用于定位线程出现的上时间卡顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的常见原因。命令格式如下:
jstack [option] vmid
打印指定进程的线程信息到指定文件
jstack 28459 >>/mnt/TFS/bcd.text
打印出的结果是多个线程信息,取其中一个信息如下图,图中圈红的这个线程是dubbo服务的调度线程,当前状态是WAITING