JDK工具包
jps
jps:Java Virtual Machine Process Status Tool
查看Java进程 ,相当于Linux下的ps命令,只不过它只列出Java进程
jps :列出Java程序进程ID和Main函数名称
jps -q :只输出进程ID
jps -m :输出传递给Java进程(主函数)的参数
jps -l :输出主函数的完整路径
jps -v :显示传递给Java虚拟的参数
[root@ecs-zhaocc-01 ~]# jps
21960 Jps
21451 DeadLockTest
925 WrapperSimpleApp
jstat
jstat:JVM Statistics Monitoring Tool
jstat可以查看Java程序运行时相关信息,可以通过它查看堆信息的相关情况
jstat - [-t] [-h] [ []]
options:由以下值构成
-class:显示ClassLoader的相关信息
-compiler:显示JIT编译的相关信息
-gc:显示与GC相关信息
-gccapacity:显示各个代的容量和使用情况
-gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因
-gcnew:显示新生代信息
-gcnewcapacity:显示新生代大小和使用情况
-gcold:显示老年代信息
-gcoldcapacity:显示老年代大小
-gcpermcapacity:显示永久代大小
-gcutil:显示垃圾收集信息
[root@ecs-zhaocc-01 ~]# jstat -gc 21451 1000 5
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
5120.0 5120.0 0.0 0.0 31744.0 3110.1 60416.0 16966.6 21296.0 20831.5 2688.0 2604.9 3 0.021 1 0.032 0.053
5120.0 5120.0 0.0 0.0 31744.0 3110.1 60416.0 16966.6 21296.0 20831.5 2688.0 2604.9 3 0.021 1 0.032 0.053
5120.0 5120.0 0.0 0.0 31744.0 3110.1 60416.0 16966.6 21296.0 20831.5 2688.0 2604.9 3 0.021 1 0.032 0.053
5120.0 5120.0 0.0 0.0 31744.0 3110.1 60416.0 16966.6 21296.0 20831.5 2688.0 2604.9 3 0.021 1 0.032 0.053
5120.0 5120.0 0.0 0.0 31744.0 3110.1 60416.0 16966.6 21296.0 20831.5 2688.0 2604.9 3 0.021 1 0.032 0.053
S0C:年轻代中第一个survivor(幸存区)的容量 (单位kb)
S1C:年轻代中第二个survivor(幸存区)的容量 (单位kb)
S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (单位kb)
S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (单位kb)
EC :年轻代中Eden(伊甸园)的容量 (单位kb)
EU :年轻代中Eden(伊甸园)目前已使用空间 (单位kb)
OC :Old代的容量 (单位kb)
OU :Old代目前已使用空间 (单位kb)
MC:metaspace(元空间)的容量 (单位kb)
MU:metaspace(元空间)目前已使用空间 (单位kb)
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
jinfo
jinfo:Java Configuration Info
jinfo可以用来查看正在运行的java程序的扩展参数,甚至支持运行时,修改部分参数
jinfo [option]
-flags 打印虚拟机 VM 参数
-flag 打印指定虚拟机 VM 参数
-flag [+|-] 打开或关闭虚拟机参数
-flag = 设置指定虚拟机参数的值
[root@ecs-zhaocc-01 ~]# jinfo 21451
Attaching to process ID 21451, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.261-b12
Java System Properties:
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.261-b12
sun.boot.library.path = /usr/local/java/jdk1.8.0_261/jre/lib/amd64
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = CN
user.dir = /root
java.vm.specification.name = Java Virtual Machine Specification
java.runtime.version = 1.8.0_261-b12
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /usr/local/java/jdk1.8.0_261/jre/lib/endorsed
java.io.tmpdir = /tmp
line.separator =
java.vm.specification.vendor = Oracle Corporation
os.name = Linux
sun.jnu.encoding = UTF-8
java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.specification.name = Java Platform API Specification
java.class.version = 52.0
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 3.10.0-1160.76.1.el7.x86_64
user.home = /root
user.timezone = Asia/Shanghai
java.awt.printerjob = sun.print.PSPrinterJob
file.encoding = UTF-8
java.specification.version = 1.8
user.name = root
java.class.path = .:/usr/local/java/jdk1.8.0_261/jre/lib/ext:/usr/local/java/jdk1.8.0_261/lib/tools.jar
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = DeadLockTest
java.home = /usr/local/java/jdk1.8.0_261/jre
user.language = zh
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.X11.XToolkit
java.vm.info = mixed mode
java.version = 1.8.0_261
java.ext.dirs = /usr/local/java/jdk1.8.0_261/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path = /usr/local/java/jdk1.8.0_261/jre/lib/resources.jar:/usr/local/java/jdk1.8.0_261/jre/lib/rt.jar:/usr/local/java/jdk1.8.0_261/jre/lib/sunrsasign.jar:/usr/local/java/jdk1.8.0_261/jre/lib/jsse.jar:/usr/local/java/jdk1.8.0_261/jre/lib/jce.jar:/usr/local/java/jdk1.8.0_261/jre/lib/charsets.jar:/usr/local/java/jdk1.8.0_261/jre/lib/jfr.jar:/usr/local/java/jdk1.8.0_261/jre/classes
java.vendor = Oracle Corporation
file.separator = /
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.cpu.isalist =
VM Flags:
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=130023424 -XX:MaxHeapSize=2051014656 -XX:MaxNewSize=683671552 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=42991616 -XX:OldSize=87031808 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line:
jmap
jmap:Memory Map
jmap用来查看堆内存使用状况,一般结合jhat使用
option: 选项参数。
pid: 需要打印配置信息的进程ID。
executable: 产生核心dump的Java可执行文件。
core: 需要打印配置信息的核心文件。
server-id: 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
remote server IP or hostname 远程调试服务器的IP地址或主机名。
option
no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
heap: 显示Java堆详细信息
histo[:live]: 显示堆中对象的统计信息
clstats:打印类加载器信息
finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump::生成堆转储快照
F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
help:打印帮助信息
常用dump
命令:jmap -dump:format=b,file=heapdump.hprof pid
描述:生成堆转储快照dump文件。
以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。
这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。
jhat
jhat:Java Heap Analysis Tool,jhat 命令解析Java堆转储文件,并启动一个 web server. 然后用浏览器来查看/浏览 dump 出来的 heap
jstack
jstack:Java Stack Trace,jstack是java虚拟机自带的一种堆栈跟踪工具,用于生成java虚拟机当前时刻的线程快照
在thread dump中,要留意下面几种状态
死锁,Deadlock(重点关注)
等待资源,Waiting on condition(重点关注)
等待获取监视器,Waiting on monitor entry(重点关注)
阻塞,Blocked(重点关注)
执行中,Runnable
暂停,Suspended
对象等待中,Object.wait() 或 TIMED_WAITING
停止,Parked
[root@ecs-zhaocc-01 ~]# jstack 21451|grep BLOCKED -A15 --color
java.lang.Thread.State: BLOCKED (on object monitor)
at DeadLockTest.lambda$main$1(DeadLockTest.java:28)
- waiting to lock <0x00000000d745cff8> (a java.lang.Object)
- locked <0x00000000d745d008> (a java.lang.Object)
at DeadLockTest$$Lambda$2/303563356.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Thread-0" #9 prio=5 os_prio=0 tid=0x00007f16a8191800 nid=0x53da waiting for monitor entry [0x00007f1681e16000]
java.lang.Thread.State: BLOCKED (on object monitor)
at DeadLockTest.lambda$main$0(DeadLockTest.java:15)
- waiting to lock <0x00000000d745d008> (a java.lang.Object)
- locked <0x00000000d745cff8> (a java.lang.Object)
at DeadLockTest$$Lambda$1/471910020.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Service Thread" #8 daemon prio=9 os_prio=0 tid=0x00007f16a80c8800 nid=0x53d8 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C1 CompilerThread2" #7 daemon prio=9 os_prio=0 tid=0x00007f16a80bd800 nid=0x53d7 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f16a80bb800 nid=0x53d6 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
VisualVM
第三方工具
GCEasy
MAT
Arthas