一、jps (Java Process Status)
显示系统内所有的 JVM 进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。如果关闭了 UsePerfData 参数(即使用参数 -XX : -UsePerfData),那么jps、jstat 将无法探知该进程。
jps [-q] [-mlvV] [<hostid>]
-q: 仅仅显示本地虚拟机唯一id, 不显示主类的名称等.
-1: 输出应用程序主类的全类名或如果进程执行的是jar包,则输出jar完整路径.
-m: 输出虚拟机进程启动时传递给主类main()的参数.
-v: 列出虚拟机进程启动时的JVM参数.
二、jstat (JVM Statistics Monitoring Tool)
命令行工具方式监视虚拟机各种运行状态信息的。类装载、内存、垃圾收集、IT编译等运行数据。
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
option
-class: ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等。
-gc: GC堆信息。包括Eden区、Survivor区、老年代、方法区等的容量、己用空间、GC时间合计等信息。
-gcutil: 显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
-gccause: 与-gcutil功能士样,但是会额外输出导致最后一次或当前正在发生的Gc产生的原因。
-gcnew: 显示新生代GC状况
-geold: 显示老年代GC状况
vmid 线程ID
interval 指定输出统计数据的查询间隔,单位为毫秒。
count 指定查询的总次数
-t 在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒
-h 可以在周期性数据输出时,输出多少行数据后输出表头信息。
三、jinfo (Configuration Info for Java)
查看虚拟机配置参数信息,也可用于调整虚拟机标记为 manageable 的配置参数,可以立即生效。
jinfo [options] pid
- options
-sysprops 输出系统属性参数
-flags 输出全部参数
-flag param 查看具体参数
修改 Boolean 类型参数
jinfo -flag ±param pid
修改 非Boolean 类型参数
jinfo -flag param=xxx pid
四、jmap (JVM Memory Map)
作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加裁信息等。
jmap [option] pid
-option:
-dump: 生成Java堆转储快照.
- :live 只保存堆中的存活对象.
- :file 指定文件路径
- :format 指定格式
-heap: 输出整个堆空间的详细信息,包括GC的使用、堆配置信息,以及内存的使用信息等.
-histo: 输出堆中对象的统计信息,包括类、实例数量和合计容量, -histo:live只统计堆中的存活对象
-permstat: 以ClassLoader为统计口径输出永久代的内存状态信息.
常用格式:jmap -dump:live,format=b,file=<filename.hprof> <pid>
通过设置如下参数,可以在发生 OOM 时,自动导出dump文件。
-XX:+HeapDumpOnoutOfMemoryError // 在程序发生OOM时,导出应用程序的当前堆快照。
-XX:HeapDumpPath: /test/dir // 可以指定堆快照的保存位置。
jmap 导出的堆快照必定是安全点位置的。这可能导致基于该堆快照的分析结果存在偏差,如果某些对象的生命周期在两个安全点之间,那么: live选项将无法探知到这些对象。另外,如果某个线程长时间无法跑到安全点,jmap将一直等下去。与 jstat 则不同,垃圾回收器会主动将 jstat 所需要的摘要数据保存至固定位置之中,而jstat只需直接读取即可。
5、jstack(JVM Stack Trace)
用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。可用于定位线程出现长时间停顿的原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。
jstack [option] pid
-l 打印有关锁信息
-e 打印有关线程的信息
6、jcmd
它是一个多功能的工具,可以用来实现前面除了jstat之外所有的功能。比如:用它来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等。jcmd有jmap大部分功能。这里列举了常用的命令:
jcmd -l // 列出所有JVM的进程
jcmd pid [cmd]
VM.flags 查看虚拟机启动参数
GC.heap_dump 导出 JVM 的 Heap Dump
GC.heap_info 打印堆的简要信息,包括使用的GC算法、堆配置信息
VM.classloader_stats 打印类加载器信息
7、jconsole:
用于对JVM中内存、线程和类等的监控,是一个基于JMX(java management extensions)的GUT性能监控工具。在命令行输入 jconsole 或者bin目录下运行 jconsole.exe 即可使用。
8. arthas
// 系统数据实时面板
dashboard -i 100 -n 5
-i 指定查询间隔,单位毫秒
-n 指定查询次数
// 查看线程堆栈信息, 通过cpu占用率排序
thread -i 5000 -n 5 [pid]
pid 查看具体的线程情况
-b 查看死锁的线程
-i 统计5秒内 CPU利用率,单位毫秒
-n 输出前5个CPU占用率线程
// 导出dump文件到指定路径
heapdump [path]
sysprop // 查看和修改JVM系统属性
sysenv // 查看JVM环境变量
// 查看JVM已加载类的信息.
sc -[opt] 全类名 或 通配符匹配
-d: 展示每个方法的详细信息
-E: 开启正则表达式匹配,默认是通配符匹配
-f: 输出当前类的成员变量信息(需要配合参数-d一起使用)
-x: 指定输出静态变量时属性的遍历深度,默认为e,即直接使用toString 输出
// 查看类已加载的方法信息,只能看到当前类的方法,看不到父类的方法.
sm -[opt] 全类名 或 通配符匹配 [methodName]
-d: 展示每个方法的详细信息
-E: 开启正则表达式匹配,默认是通配符匹配
methodName: 可以指定具体方法名进行查看
//
watch
//
monitor
// 查看classloader 继承数,urls,类加载信息
classloader [-opt]
-t: 查看classloader的继承树
-l: 按类的加载实例查看统计信息
-c: 用 classLoader 的hash值查看对应的jars的 urls
//
trace
sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开options disable-sub-class true开关