JVM 监控及诊断工具:命令行

jps

1、Java Process Status

2、基本使用语法:jps [options] [hostid]

(1)显示指定系统内所有 HotSpot 虚拟机进程(查看虚拟机进程信息)

(2)用于查询正在运行的虚拟机进程

(3)说明:本地虚拟机的进程 ID,与操作系统的进程 ID 是一致,且唯一

(4)可以通过追加参数,打印额外的信息

3、options

(1)-q:只显示 LVMID(local virtual machine id),即本地虚拟机唯一 id,不显示主类的名称等

(2)-l:输出应用程序主类的全类名,或如果进程执行 jar 包,则输出 jar 完整路径

(3)-m:输出虚拟机进程启动时,传递给主类 main() 参数

(4)-v:列出虚拟机进程启动时的 JVM 参数。比如:-Xms20m -Xmx50m 是启动程序指定的 jvm 参数

(5)说明:以上参数可以综合使用

(6)补充:如果某个 Java 进程关闭默认开启的 UsePerfData 参数(即使用参数 -XX:-UsePerfData),则 jps(包括 jstat)将无法探知该 Java 进程

4、hostid

(1)RMI 注册表中注册的主机名

(2)如果要远程监控主机上的 Java 程序,需要安装 jstatd

(3)在严格的安全实践的网络场景,可能使用一个自定义的策略文件,显示对特定的可信主机或网络的访问,但容易受到 IP 地址欺诈攻击

(4)如果无法使用一个定制的策略文件,来处理安全问题,则最安全的操作是不运行 jstatd 服务器,而是在本地使用 jstat、jps 工具

 

jstat

1、JVM Statistics Monitoring Tool

2、基本使用语法:jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

(1)查看命令相关参数:jstat-h 或 jstat-help

(2)查看 JVM 统计信息

(3)监视虚拟机各种运行状态信息的命令行工具

(4)可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据

(5)在没有 GUI 图形界面,只提供纯文本控制台环境的服务器上,它是运行期定位虚拟机性能问题的首选工具

(7)常用于检测垃圾回收问题、内存泄漏问题

3、option

(1)类装载相关

(2)-class:显示 ClassLoader 相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等

(3)垃圾回收相关

(4)-gc:显示与 GC 相关的堆信息,包括 Eden 区、两个 Survivor 区、老年代、永久代等的容量、已用空间、GC 时间合计等信息

(5)-gccapacity:显示内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大、最小空间

(6)-gcutil:显示内容与 -gc 基本相同,但输出主要关注已使用空间占总空间的百分比

(7)-gccause:与 -gcutil 功能相同,但额外输出导致最后一次或当前正在发生的 GC 产生的原因

(8)-gcnew:显示新生代 GC 状况

(9)-gcnewcapacity:显示内容与 -gcnew 基本相同,输出主要关注新生代使用的最大、最小空间

(10)-geold:显示老年代 GC 状况

(11)-gcoldcapacity:显示内容与-gcold 基本相同,输出主要关注老年代使用的最大、最小空间

(12)-gcpermcapacity:显示永久代使用到的最大、最小空间

(13)JIT 相关

(14)-compiler:显示 JIT 编译器编译过的方法、耗时等信息

(15)-printcompilation:输出已经被 JIT 编译的方法

4、-t

(1)在输出信息前加上一个 Timestamp 列,显示程序的运行时间

(2)单位:秒

5、-h

(1)在周期性数据输出时,输出多少行(lines)数据后输出一个表头信息

表头 含义(字节)
EC Eden 区的大小
EU Eden 区已使用的大小
S0C 幸存者 0 区的大小
S1C 幸存者 1 区的大小
S0U 幸存者 0 区已使用的大小
S1U 幸存者 1 区已使用的大小
MC 元空间的大小
MU 元空间已使用的大小
OC 老年代的大小
OU 老年代已使用的大小
CCSC 压缩类空间的大小
CCSU 压缩类空间已使用的大小
YGC 从应用程序启动到采样时 young gc 的次数
YGCT 从应用程序启动到采样时 young gc 消耗时间(秒)
FGC 从应用程序启动到采样时 full gc 的次数
FGCT 从应用程序启动到采样时的 full gc 的消耗时间(秒)
GCT 从应用程序启动到采样时 gc 的总时间

6、vmid

(1)进程 id 号

(2)jps 查看进程号

7、interval

(1)指定输出统计数据的周期,即查询间隔

(1)单位:毫秒

8、count

(1)指定查询的总次数

9、判断是否出现内存泄漏

(1)第一步:在长时间运行 Java 程序中,运行 jstat 命令连续获取多行性能数据,并取这几行数据中 OU 列(即已占用的老年代内存)最小值

(2)第二步:每隔一段较长的时间重复一次上述操作,来获得多组 OU 最小值,如果这些值呈上涨趋势,则说明该 Java 程序的老年代内存已使用量在不断上涨,无法回收的对象在不断增加,因此很有可能存在内存泄漏

 

jinfo

1、Configuration Info for Java

2、实时查看、修改 JVM 配置参数

(1)多数情况下,Java 应用程序不会指定所有 Java 虚拟机参数

(2)不需要通过查找文档获取某个参数的默认值,而是使用 jinfo 工具

3、基本使用语法:jinfo [options] pid

(1)必须加上 Java 进程 ID

选项 选项说明
no option 输出全部参数、系统属性
-flag name 输出对应名称的参数
-flag [+-]name 开启或者关闭对应名称的参数 只有被标记为 manageable 的参数才可以被动态修改
-flag name=value 设定对应名称的参数
-flags 输出全部的参数
-sysprops 输出系统属性

4、拓展

(1)java -XX:+PrintFlagsInitial:查看所有 JVM 参数启动的初始值

(2)java -XX:+PrintFlagsFinal:查看所有 JVM 参数的最终值

(3)java -XX:+PrintCommandLineFlags:查看哪些已经被用户或 JVM 设置过的详细 XXX 参数的名称和值

 

jmap

JVM Memory Map

1、作用

(1)导出内存映像文件 / 获取 dump 文件:堆转储快照文件,二进制文件

(2)获取目标 Java 进程的内存相关信息,包括 Java 堆各区域的使用情况、堆中对象的统计信息、类加载信息等

2、jmap -help:查阅 jmap 工具的具体使用方式、标准选项配置

3、基本使用语法

(1)jmap [option] <pid>

(2)jmap [option] <executable core>

(3)jmap [option] [server_id@] <remote server IP or hostname>

选项 作用
-dump 生成 dump 文件(Java 堆转储快照),-dump:live 只保存堆中的存活对象
-heap 输出整个堆空间的详细信息,包括 GC 的使用、堆配置信息,以及内存的使用信息等
-histo 输出堆空间中对象的统计信息,包括类、实例数量和合计容量,-histo:live 只统计堆中的存活对象
-J <flag> 传递参数给 jmap 启动的 JVM
-finalizerinfo 显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象,仅 linux / solaris 平台有效
-permstat 以 ClassLoader 为统计口径输出永久代的内存状态信息,仅 linux / solaris 平台有效
-F 当虚拟机进程对 -dump 选项没有任何响应时,强制执行生成 dump 文件,仅 linux / solaris 平台有效

4、安全点机制

(1)因为 jmap 将访问堆中的所有对象,为保证在此过程中不被应用线程干扰,jmap 需要借助安全点机制,让所有线程停留在不改变堆中数据的状态

(2)由 jmap 导出的堆快照必定在安全点位置,可能导致基于该堆快照的分析结果存在偏差

(3)如果在编译生成的机器码中,某些对象的生命周期在两个安全点之间,则 :live 选项将无法探知到这些对象

(4)如果某个线程长时间无法跑到安全点,jmap 将一直等待

(5)与 jstat 不同,垃圾回收器会主动将 jstat 所需要的摘要数据,保存至固定位置之中,而 jstat 只需直接读取即可

 

jhat

1、JVM Heap Analysis Tool

2、JDK 自带堆分析工具

(1)Sun JDK 提供 jhat、jmap 搭配使用,用于分析 jmap 生成的 heap dump 文件(堆转储快照)

(2)jhat 内置一个微型 HTTP / HTML 服务器,生成 dump 文件的分析结果后,用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)

(3)使用 jhat 启动 http 服务,端口是 7000,即 http://localhost:7000/

(4)jhat 在 JDK9、JDK10 中已经被删除,官方建议使用 VisualVM 代替

3、基本适用语法:jhat <option> <dumpfile>

option 参数 作用
-stack false | true 关闭|打开对象分配调用栈跟踪
-refs false | true 关闭|打开对象引用跟踪
-port port-number 设置 jhat HTTP Server 的端口号,默认 7000
-exclude exclude-file 执行对象查询时,需要排除的数据成员
-baseline exclude-file 指定一个基准堆转储
-debug int 设置 debug 级别
-version 启动后显示版本信息就退出
-J <flag> 传入启动参数,比如 -J -Xmx512m

 

jstack

1、JVM Stack Trace

2、打印 JVM 中线程快照

(1)生成虚拟机指定进程,当前时刻的线程快照(虚拟机堆栈跟踪)

(2)线程快照:当前虚拟机内指定进程的每一条线程,正在执行的方法堆栈的集合

3、生成线程快照的作用

(1)定位线程出现长时间停顿的原因,如:线程间死锁、死循环、请求外部资源等待过长时间等

(2)当线程出现停顿时,使用 jstack 显示各个线程调用的堆栈情况

4、在 thread dump 中关注的状态

(1)死锁,Deadlock

(2)等待资源,Waiting on condition

(3)等待获取监视器,Waiting on monitor entry

(4)阻塞,Blocked

(5)执行中,Runnable

(6)暂停,Suspended

(7)对象等待中,Object.wait() 或 TIMED_WAITING

(8)停止,Parked

5、基本使用语法:jstack option pid

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

6、如果 jstack 管理远程进程,需要在远程程序的启动参数中增加

(1)-Djava.rmi.server.hostname=主机名

(2)-Dcom.sun.management·jmxremote

(3)-Dcom.sun.management·jmxremote·port=8888

 

jcmd

1、在 JDK 1.7 后新增,一个多功能的工具

(1)实现前面除 jstat 之外所有命令的功能

(2)如:导出堆、内存使用、查看 Java 进程、导出线程信息、执行 GC、JVM 运行时间等

2、jcmd 拥有 jmap 大部分功能,官方推荐使用 jcmd 代替 jmap

3、jcmd -l:列出所有 JVM 进程

4、jcmd 进程号 help:针对指定的进程,列出支持的所有具体命令

5、jcmd 进程号 具体命令:显示指定进程的指令命令的数据

(1)Thread.print:可以替换 jstack 指令

(2)GC.class_histogram:可以替换 jmap 中的-histo 操作

(3)GC.heap_dump:可以替换 jmap 中的-dump 操作

(4)GC.run:可以查看 GC 的执行情况

(5)VM.uptime:可以查看程序的总执行时间,可以替换 jstat 指令中的 -t 操作

(6)VM.system_properties:可以替换 jinfo -sysprops 进程 id

(7)VM.flags:可以获取 JVM 的配置参数信息

 

jstatd

1、远程主机信息收集

2、jps、jstat 等支持对远程计算机的监控

3、启用远程监控,需要配合使用 jstatd

(1)jstatd 是一个 RMI 服务端程序,等价于代理服务器,建立本地计算机与远程监控工具的通信

(2)jstatd 服务器将本机 Java 应用程序信息,传递到远程计算机

posted @   半条咸鱼  阅读(184)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示