转载

读书笔记之《实战Java虚拟机》(6):性能监控工具

top - 19:55:08 up 22 days,  3:12,  1 user,  load average: 0.01, 0.08, 0.07
Tasks:  77 total,   1 running,  76 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.3 us,  0.7 sy,  0.0 ni, 97.0 id,  1.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1016380 total,    76076 free,   864172 used,    76132 buff/cache
KiB Swap:        0 total,        0 free,        0 used.    35740 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
  579 root      20   0  586424  42072    148 S  0.3  4.1  32:11.25 YDService
 2051 root      20   0  741344  10944   1456 S  0.3  1.1  72:05.36 barad_agent
11108 root      20   0  143948   1260    220 S  0.3  0.1  20:35.96 redis-server
23059 mysql     20   0 1421440 411764      0 S  0.3 40.5  19:36.60 mysqld
    1 root      20   0   41048   2316   1180 S  0.0  0.2   1:14.65 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.12 kthreadd
    ... ...
复制代码

分为上下两部分:前半部分是系统统计信息,后半部分是进程信息。

使用top命令可以从宏观上观察系统各个进程堆 CPU 的占用情况,以及内存使用情况。

监控内存和 CPU —— vmstat 命令

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  78252    544  75832    0    0   227    18   18   12  1  0 99  0  0
复制代码

可以指定采样周期和采样次数,例每秒采样 1 次,共 3 次:vmstat 1 3

vmstat 工具可以查看内存、交互分区、I/O 操作、上下文切换、时钟中断,以及 CPU 的使用情况。

监控 IO 使用 —— iostat 命令

Linux 3.10.0-514.26.2.el7.x86_64 (VM_0_6_centos) 	03/22/2019 	_x86_64_	(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.55    0.00    0.40    0.36    0.00   98.70

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.00         0.00         0.00        316          0
vda               6.52       228.32        18.13  435180743   34554796
复制代码

同样可指定采样周期和采样次数。

磁盘 I/O 很容易成为系统性能瓶颈,通过 iostat 可以快速定位系统是否产生了大量的 I/O 操作。

多功能诊断器 —— pidstat 工具

pidstat -p 29839 -u 1 3, -u 指定对 CPU 使用监控;

Linux 3.10.0-514.26.2.el7.x86_64 (VM_0_6_centos) 	03/22/2019 	_x86_64_	(1 CPU)

08:22:50 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
08:22:51 PM     0     29839    0.00    0.00    0.00    0.00     0  java
08:22:52 PM     0     29839    0.00    0.00    0.00    0.00     0  java
08:22:53 PM     0     29839    0.00    0.00    0.00    0.00     0  java
Average:        0     29839    0.00    0.00    0.00    0.00     -  java
复制代码

pidstat -p 29839 -d 1 3, -d 指定对 I/O 使用监控;

Linux 3.10.0-514.26.2.el7.x86_64 (VM_0_6_centos) 	03/22/2019 	_x86_64_	(1 CPU)

08:26:12 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
08:26:13 PM     0     29839      0.00      0.00      0.00  java
08:26:14 PM     0     29839      0.00      0.00      0.00  java
08:26:15 PM     0     29839      0.00      0.00      0.00  java
Average:        0     29839      0.00      0.00      0.00  java
复制代码

pidstat -p 29839 -r 1 3, -d 指定对 内存 使用监控;

Linux 3.10.0-514.26.2.el7.x86_64 (VM_0_6_centos) 	03/22/2019 	_x86_64_	(1 CPU)

08:27:34 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
08:27:35 PM     0     29839      0.00      0.00 2359408 316676  31.16  java
08:27:36 PM     0     29839      0.00      0.00 2359408 316676  31.16  java
08:27:37 PM     0     29839      0.00      0.00 2359408 316676  31.16  java
Average:        0     29839      0.00      0.00 2359408 316676  31.16  java
复制代码

pidstat 工具是一款多合一的优秀工具。它不仅可以监控 CPU、I/O 和内存资源,甚至可以将问题定位到相关线程,方便应用程序的故障排查。

Windows 下的性能监控工具

任务管理器

在桌面底边栏右键单击,或者通过 Ctrl + Alt + Del 组合件呼出。

读书笔记之《实战Java虚拟机》(6):性能监控工具

任务管理器很常用,也非常强大,它可以显示系统的网络负载、任意进程的 CPU 占用率、内存使用量以及 I/O 使用情况。

读书笔记之《实战Java虚拟机》(6):性能监控工具

perfmon 性能监控工具

可以在开始菜单的“运行”对话框中使用 perfmon 命令,或者双击控制面板的管理工具中的“性能监视器”打开这个工具;

读书笔记之《实战Java虚拟机》(6):性能监控工具

perfmon 工具也是 Windows 自带的一款性能监控软件。可以监控的性能指标繁多,功能也非常强大。当任务管理无法满足要求时,推荐使用。

perfmon 工具支持带参数 /res 启动,用于专门监控系统资源的使用情况:perfmon /res

读书笔记之《实战Java虚拟机》(6):性能监控工具

JDK 性能监控工具

查看 Java 进程 —— jps 命令

jps 类似 linux 下的 ps,但它只用于列出 Java 的进程。

[root@VM_0_6_centos ~]# jps
28646 Jps
29839 jar
复制代码

查看虚拟机运行时信息 —— jstat 命令

jstat 用于观察 Java 应用程序运行时相关信息的工具。基本语法为:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval>] [<count>]
复制代码
  • 选项 option 可以由下列值构成:

    • -class:显示 ClassLoader 的相关信息
    • -compiler:显示 JIT 编译的相关信息
    • -gc:显示与 GC 相关的堆信息
    • -gccapacity:显示各个代的容量及使用情况
    • -gccause:显示垃圾收集相关信息,同时显示最后一次或当前正在发生的垃圾手机的诱发原因
    • -gcnew:显示新生代信息
    • -gcnewcapacity:显示新生代大小与使用情况
    • -gcold:显示老年代信息
    • -gcoldcapacity:显示老年代的大小
    • -gcpermcapacity:显示永久代的大小
    • -printcompilation:输出 JIT 编译的方法信息
  • -t 参数可以在输出信息前加上一个 Timestamp 列,显示程序的运行时间

  • -h 参数可以周期性输出时,输出多少行数据后,跟着输出一个表头信息

  • interval 参数指定统计数据的周期,单位为毫秒

  • count 用于指定一共输出多少次数据

查看 GC 相关的对信息输出

[root@VM_0_6_centos ~]# jstat -gc 29839
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
4352.0 4352.0  0.0   1614.1 34816.0   3974.8   86828.0    74678.7   67632.0 64592.8 8240.0 7731.2    405    1.665   6      0.521    2.187
复制代码

查看虚拟机参数 —— jinfo 命令

jinfo 查看正在运行的 Java 应用程序的拓展参数,甚至支持在运行时,修改部分参数,基本语法为:

jinfo <option> <pid>
复制代码

其中 option 可以为以下信息:

  • -flag:打印指定 Java 虚拟机的参数值
  • -flag[+|-]:设置指定 Java 虚拟机参数的布尔值
  • -flag=:设置指定 Java 虚拟机参数的值

例如查看当前新生代对象晋升到老年代对象的最大年龄;

[root@VM_0_6_centos ~]# jinfo -flag MaxTenuringThreshold 29839
-XX:MaxTenuringThreshold=15
复制代码

导出堆到文件 —— jmap 命令

查看虚拟机状态;

[root@VM_0_6_centos ~]# jmap -heap 29839
Attaching to process ID 29839, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 262144000 (250.0MB)
   NewSize                  = 5570560 (5.3125MB)
   MaxNewSize               = 87359488 (83.3125MB)
   OldSize                  = 11206656 (10.6875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 40108032 (38.25MB)
   used     = 7851408 (7.4876861572265625MB)
   free     = 32256624 (30.762313842773438MB)
   19.57565008425245% used
Eden Space:
   capacity = 35651584 (34.0MB)
   used     = 6198592 (5.91143798828125MB)
   free     = 29452992 (28.08856201171875MB)
   17.386582318474264% used
From Space:
   capacity = 4456448 (4.25MB)
   used     = 1652816 (1.5762481689453125MB)
   free     = 2803632 (2.6737518310546875MB)
   37.08819221047794% used
To Space:
   capacity = 4456448 (4.25MB)
   used     = 0 (0.0MB)
   free     = 4456448 (4.25MB)
   0.0% used
tenured generation:
   capacity = 88911872 (84.79296875MB)
   used     = 76470984 (72.92841339111328MB)
   free     = 12440888 (11.864555358886719MB)
   86.00761887006496% used

26446 interned Strings occupying 3202672 bytes.
复制代码

图形化虚拟机监控工具 JConsole

JConsole 工具是 JDK 自带的图形化性能监控工具,位于 %JAVA_HOME%/bin 目录下,启动如下图所示;

读书笔记之《实战Java虚拟机》(6):性能监控工具

连接上 Java 应用程序后,便可以查看应用程序概况;

读书笔记之《实战Java虚拟机》(6):性能监控工具
原文  https://juejin.im/post/5c94cb8cf265da60c6038cca
正文到此结束
Loading...