【JVM进阶之路】八:性能监控工具-命令行篇
定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。
在实际的故障排查、性能监控中,常常是操作系统的工具和Java虚拟机的工具结合使用。
1、操作系统工具
1.1、top:显示系统整体资源使用情况
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
在Linux使用top命令的部分输出如下:

top命令的输出可以分为两个部分:前半部分是系统统计信息,后半部分是进程信息。
在统计信息中:
- 第1行是任务队列信息,从左到右依次表示:系统当前时间、系统运行时间、当前登录用户,最后的load average表示系统的平均负载。
- 第2行是进程统计信息,分别有正在运行的进程数、睡眠进程数、停止的进程数、僵尸进程数。
- 第3行是CPU统计信息,us表示用户空间CPU占用率,sy表示内核空间CPU占用率、ni表示用户进程空间改变过优先级的进程cpu的占用率、id表示空闲cpu占用率、wa表示等待输入输出的CPU时间百分比、hi表示硬件中断请求、si表示软件中断请求。
在进程信息区中,显示了系统各个进程的资源使用情况。主要字段的含义:
- PID:进程id
- USER:进程所有者的用户名
- PR:优先级
- NI:nice值,负值表示高优先级,正值表示低优先级
- TIME+:进程使用的CPU时间总计,单位1/100秒
- COMMAND:命令名/命令行
1.2、vmstat:监控内存和CPU
vmstat也是一款功能比较齐全的性能监测工具。它可以统计CPU、内存使用情况、swap使用情况能信息。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

以下命令表示每秒采样一次,共三次。
输出的各个列的含义:
| 分类 | 说明 |
|---|---|
| Procs | r: 运行队列中进程数量 b: 等待IO的进程数量 |
| Memory(内存) | swpd: 使用虚拟内存大小 free: 可用内存大小 buff: 用作缓冲的内存大小 cache: 用作缓存的内存大小 |
| Swap: | si: 每秒从交换区写到内存的大小 so: 每秒写入交换区的内存大小 IO:(现在的Linux版本块的大小为1024bytes) bi: 每秒读取的块数 bo: 每秒写入的块数 |
| 系统 | in: 每秒中断数,包括时钟中断 cs: 每秒上下文切换数 |
| CPU(以百分比表示) | us: 用户进程执行时间(user time) sy: 系统进程执行时间(system time) id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 ,以百分比表示。 wa: 等待IO时间 |
1.3、iostat:监控IO使用
iostat可以提供磁盘IO的监控数据:
avg-cpu: %user %nice %system %iowait %steal %idle
1.44 0.00 0.39 0.00 0.00 98.17
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.37 0.47 30.30 3561197 229837730
dm-0 0.44 0.33 29.97 2518272 227313194
dm-1 0.12 0.13 0.33 1013276 2520308
dm-2 0.00 0.00 0.00 502 2068
以上命令显示了CPU的使用概况和磁盘I/O的信息。
输出结果各个列的含义:
iostat结果面板 avg-cpu 描述的是系统cpu使用情况:
- %user:CPU处在用户模式下的时间百分比。
- %nice:CPU处在带NICE值的用户模式下的时间百分比。
- %system:CPU处在系统模式下的时间百分比。
- %iowait:CPU等待输入输出完成时间的百分比。
- %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
- %idle:CPU空闲时间百分比。
1.4、netstat:监控网络使用
在web程序中,可能运行需要网络,可以使用netstat命令监控网络流量。
netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:30037 *:* LISTEN
udp 0 0 *:bootpc *:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 6135 /tmp/.X11-unix/X0
unix 2 [ ACC ] STREAM LISTENING 5140 /var/run/acpid.socket
...
以上命令表示列出所有端口信息。
2、JDK性能监控工具
除了我们比较熟悉的java.exe、javac.exe这两个命令行工具,在jdk的bin目录下,还有一些其它的工具。。除了编译和运行Java程序外,打包、部署、签名、调试、监控、运维等各种场景都可能会用到它们。

2.1、jps:虚拟机进程查看
jps类似Linux下的ps,它会列出Java程序的进程。
jps命令格式:
jps [ options ] [ hostid ]
jps命令示例:

jps的常用选项见表:
| 选项列表 | 描述 |
|---|---|
| -q | 只输出进程 ID,忽略主类信息 |
| -l | 输出主类全名,或者执行 JAR 包则输出路径 |
| -m | 输出虚拟机进程启动时传递给主类 main()函数的参数 |
| -v | 输出虚拟机进程启动时的 JVM 参数 |
2.2、jstat:虚拟机运行时信息查看
jsta是一个强大的工具。它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。
jstat命令格式为:
jstat [ option vmid [interval[s|ms] [count]] ]
选项option代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况。
如下,输出Java进程5728的ClassLoader相关信息,每秒统计一次信息,一共输出两次。

下例展示了与GC相关的堆信息的输出:

jstat工具主要选项:
| 选项列表 | 描述 |
|---|---|
| -class | 监视类加载、卸载数量、总空间以及类装载所耗费时长 |
| -gc | 监视 Java 堆情况,包括 Eden 区、2 个 Survivor 区、老年代、永久代或者 jdk1.8 元空间等,容量、已用空间、垃圾收集时间合计等信息 |
| -gccapacity | 监视内容与-gc 基本一致,但输出主要关注 Java 堆各个区域使用到的最大、最小空间 |
| -gcutil | 监视内容与-gc 基本相同,但输出主要关注已使用空间占总空间的百分比 |
| -gccause | 与 -gcutil 功能一样,但是会额外输出导致上一次垃圾收集产生的原因 |
| -gcnew | 监视新生代垃圾收集情况 |
| -gcnewcapacity | 监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间 |
| -gcold | 监视老年代垃圾收集情况 |
| -gcoldcapacity | 监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间 |
| -compiler | 输出即时编译器编译过的方法、耗时等信息 |
| -printcompilation | 输出已经被即时编译的方法 |
2.3、jinfo:虚拟机配置查看
jinfo的作用是实时查看和调整虚拟机各项参数。
jinfo命令格式:
jinfo [ option ] pid
下例显示了新生爱对象晋升老年代的最大年龄。在应用程序启动时,没有指定,但通过jinfo,查看该参数的当前数值。

查看是否打印GC详细信息:

2.4、jmap:内存映像(导出)
jmap命令用于生成堆转储快照(一般称为heapdump或dump文件)
jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
jmap命令格式:
jmap [ option ] vmid
如下,使用jmap生成PID为5728的Java程序的对象统计信息, 并输出到dump.txt中。

dump.txt的结构如下:

jmap更重要的功能是得到Java程序的当前堆快照:

如图,将应用程序的堆快照输出到D盘的heap.hprof文件中,之后,可以通过多种工具分析该堆文件。
jmap工具主要选项:
| 选项 | 描述 |
|---|---|
| -dump | 生成 Java 堆转储快照。 |
| -finalizerinfo | 显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象。Linux平台 |
| -heap | 显示 Java 堆详细信息,比如:用了哪种回收器、参数配置、分代情况。Linux 平台 |
| -histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
| -permstat | 显示永久代内存状态,jdk1.7,永久代 |
| -F | 当虚拟机进程对 -dump 选项没有响应式,可以强制生成快照。Linux平台 |
2.5、jhat:堆转储快照分析
JDK提供jhat命令与jmap搭配使用,来分析jmap生成的堆转储快照。 jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。
以前面生成的heap.hprof为例:

屏幕显示“Server is ready.”的提示后,用户在浏览器中输入http://localhost:7000/可以看到分析结果

2.6、jstack:Java堆栈跟踪
jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者 javacore文件)。
jstack命令格式:
jstack [ option ] vmid
如下,使用stack查看线程堆栈的部分结果:

jstack工具主要选项:
| 选项 | 描述 |
|---|---|
| -F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
| -l | 除了堆栈外,显示关于锁的附加信息 |
| -m | 如果调用的是本地方法的话,可以显示 c/c++的堆栈 |
2.7、jcmd:多功能命令
在jdk1.7以后,新增了一个请打的命令行工具jcmd,它可以实现上面除了jstat外所有命令的功能。
例如,使用jcmd列出当前系统中的所有运行中的Java虚拟机:

jmcd命令格式:
jcmd <pid | main class> <command ... | PerfCounter.print | -f file>
jmcd工具主要选项:
| 选项 | 描述 | |
|---|---|---|
| help | 打印帮助信息,示例:jcmd help [] | |
| ManagementAgent.stop | 停止JMX Agent | |
| ManagementAgent.start_local | 开启本地JMX Agent | |
| ManagementAgent.start | 开启JMX Agent | |
| Thread.print | 参数-l打印java.util.concurrent锁信息,相当于:jstack | |
| PerfCounter.print | 相当于:jstat -J-Djstat.showUnsupported=true -snap | |
| GC.class_histogram | 相当于:jmap -histo | |
| GC.heap_dump | 相当于:jmap -dump:format=b,file=xxx.bin | |
| GC.run_finalization | 相当于:System.runFinalization() | |
| GC.run | 相当于:System.gc() | |
| VM.uptime | 参数-date打印当前时间,VM启动到现在的时候,以秒为单位显示 | |
| VM.flags | 参数-all输出全部,相当于:jinfo -flags , jinfo -flag | |
| VM.system_properties | 相当于:jinfo -sysprops | |
| VM.command_line | 相当于:jinfo -sysprops | grep command |
| VM.version | 相当于:jinfo -sysprops | grep version |
参考:
【1】:周志朋编著《深入理解Java虚拟机:JVM高级特性与最佳实践》
【2】:《Java性能权威指南》
【3】:《实战JAVA虚拟机 JVM故障诊断与性能优化》
【4】:jcmd命令详解
【JVM进阶之路】八:性能监控工具-命令行篇的更多相关文章
- 树莓派进阶之路 (018) - raspberryPi摄像头命令行软件raspistill帮助文档
文档原文:https://www.raspberrypi.org/app/uploads/2013/07/RaspiCam-Documentation.pdf 作用 在指定的时间运行摄像头,而且如果需 ...
- <JVM下篇:性能监控与调优篇>01-概述篇-02-JVM监控及诊断工具-命令行篇
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- 20个常用Linux性能监控工具/命令
20个常用Linux性能监控工具/命令 对于 Linux/Unix 系统管理员非常有用的并且最常用的20个命令行系统监视工具.这些命令可以在所有版本的 Linux 下使用去监控和查找系统性能的实际原因 ...
- Scala进阶之路-并发编程模型Akka入门篇
Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...
- 【JVM进阶之路】十:JVM调优总结
1.调优原则 JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹. 比较认可廖雪峰老师的观点,要认识到JVM调优不是常规手段,性能问题一般第一选择是优化程序,最后的 ...
- Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)
一.介绍 今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分.话不多说,开始我们今天的讲解.如果要想看第一篇文章,地址如下:http: ...
- Redis进阶实践之十四 Redis-cli命令行工具使用详解
转载来源:http://www.cnblogs.com/PatrickLiu/p/8508975.html 一.介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redi ...
- Redis进阶实践之十四 Redis-cli命令行工具使用详解第一部分
一.介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redis的东西要看的都差不多看完了.网上的东西也不多了.剩下来就看看官网的东西吧,一遍翻译,一遍测试. ...
- pytest封神之路第二步 132个命令行参数用法
在Shell执行pytest -h可以看到pytest的命令行参数有这10大类,共132个 序号 类别 中文名 包含命令行参数数量 1 positional arguments 形参 1 2 gene ...
随机推荐
- YouTube 视频下载工具
YouTube 视频下载工具 我不生产视频,只是优秀视频的搬运工! YouTube-dl https://github.com/search?q=youtube-dl https://github.c ...
- 在线可视化设计网站 & 在线编辑器
在线可视化设计网站 在线编辑器:海报编辑器.H5 编辑器.视频编辑器.音频编辑器.抠图编辑器 在线 拖拽 可视化 编辑器 Canvas WebGL Canva With Canva, anyone c ...
- ES6 Set vs ES5 Array
ES6 Set vs ES5 Array Set https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Ob ...
- learning-js-by-reading-source-codes
learning-js-by-reading-source-codes BigInt https://github.com/learning-js-by-reading-source-codes/lo ...
- c++ string与wstring转换
wchar_t to char #include <comdef.h> const wchar_t* exepath = L"d:\\中文 路径\\中文 路径.exe" ...
- java数据类型(进阶篇)
public class note03 { public static void main(String[] args) { //数据类型拓展 //1.整数拓展 //进制: 二进制0b 十进制 八进制 ...
- 07_MySQL修改数据库的表结构
修改数据库的表结构
- 微信小程序:post请求参数放在请求体中还是拼接到URL中需要看后台是如何接收的
前端发送post请求时,请求参数可以放在请求中,代码如下: function post(url, data, callback) { wx.request({ method: 'POST', url: ...
- Centos7.7下安装Python3.7 并兼容python2.7
前言 1.首先来看一下系统版本 [root@python3 ~]# cat /etc/redhat-release CentOS Linux release 7.7.1810 (Core) 2.更新一 ...
- void指针及指针的多次赋值的理解
1.void指针的类型转换 int A::functionCommamd(const DWORD _from,const DWORD _to,const DWORD Event_type,void * ...