【JVM进阶之路】八:性能监控工具-命令行篇

简介: 【JVM进阶之路】八:性能监控工具-命令行篇

       

定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。

在实际的故障排查、性能监控中,常常是操作系统的工具和Java虚拟机的工具结合使用。

1、操作系统工具

1.1、top:显示系统整体资源使用情况

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。

在Linux使用top命令的部分输出如下:

image.png

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工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

image.png

以下命令表示每秒采样一次,共三次。

输出的各个列的含义:

分类 说明
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程序外,打包、部署、签名、调试、监控、运维等各种场景都可能会用到它们。

image.png

2.1、jps:虚拟机进程查看

jps类似Linux下的ps,它会列出Java程序的进程。

jps命令格式:

jps [ options ] [ hostid ] 

jps命令示例:

image.png

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相关信息,每秒统计一次信息,一共输出两次。

image.png

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

image.png

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详细信息:

image.png

2.4、jmap:内存映像(导出)

jmap命令用于生成堆转储快照(一般称为heapdump或dump文件)

jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。

jmap命令格式:

jmap [ option ] vmid

如下,使用jmap生成PID为5728的Java程序的对象统计信息, 并输出到dump.txt中。

image.png

dump.txt的结构如下:

image.png

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

image.png

如图,将应用程序的堆快照输出到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为例:

image.png

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

image.png

2.6、jstack:Java堆栈跟踪

jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者 javacore文件)。

jstack命令格式:

jstack [ option ] vmid

如下,使用stack查看线程堆栈的部分结果:

image.png

jstack工具主要选项:

选项 描述
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-l 除了堆栈外,显示关于锁的附加信息
-m 如果调用的是本地方法的话,可以显示 c/c++的堆栈

2.7、jcmd:多功能命令

在jdk1.7以后,新增了一个请打的命令行工具jcmd,它可以实现上面除了jstat外所有命令的功能。

例如,使用jcmd列出当前系统中的所有运行中的Java虚拟机:

image.png

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月前
|
Arthas Prometheus 监控
监控堆外使用JVM工具
监控堆外使用JVM工具
39 7
|
2月前
|
JavaScript 前端开发 Java
jvm的jshell,学生的工具
本文介绍了JVM的jshell工具,它为Java平台添加了REPL(读取-评估-打印循环)功能,使得学习、探索编码和原型代码变得更加便捷,但作者认为其在实际开发中较为鸡肋。
46 1
jvm的jshell,学生的工具
|
2月前
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
|
2月前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
64 2
|
2月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
76 3
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
60 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
4月前
|
监控 Java 开发者
揭秘Struts 2性能监控:选对工具与方法,让你的应用跑得更快,赢在起跑线上!
【8月更文挑战第31天】在企业级应用开发中,性能监控对系统的稳定运行至关重要。针对流行的Java EE框架Struts 2,本文探讨了性能监控的工具与方法,包括商用的JProfiler、免费的VisualVM以及Struts 2自带的性能监控插件。通过示例代码展示了如何在实际项目中实施这些监控手段,帮助开发者发现和解决性能瓶颈,确保应用在高并发、高负载环境下稳定运行。选择合适的监控工具需综合考虑项目需求、成本、易用性和可扩展性等因素。
49 0
|
4月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
100 0
|
4月前
|
SQL 监控 关系型数据库
SQL性能监控与调优工具的神奇之处:如何用最佳实践选择最适合你的那一个,让你的数据库飞起来?
【8月更文挑战第31天】在现代软件开发中,数据库性能监控与调优对应用稳定性至关重要。本文对比了数据库内置工具、第三方工具及云服务工具等几种常用SQL性能监控与调优工具,并通过示例代码展示了如何利用MySQL的EXPLAIN功能分析查询性能。选择最适合的工具需综合考虑功能需求、数据库类型及成本预算等因素。遵循了解工具功能、试用工具及定期维护工具等最佳实践,可帮助开发者更高效地管理和优化数据库性能,迎接未来软件开发中的挑战与机遇。
64 0
|
4月前
|
存储 监控 Ubuntu
完全交互式!易于使用的 Linux 性能监控工具
完全交互式!易于使用的 Linux 性能监控工具