Java自带的JVM性能监控及调优工具(jps、jinfo、jstat、jmap、javap)使用介绍
JVM介绍
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JVM性能监控及调优的意义
JVM作为java程序运行时的环境,它的性能好坏直接影响java程序的性能,合适的环境对于java程序起着举足轻重的作用。
性能监控及调优工具
1. jps
jps(Java Virtual Machine Process Status Tool)是JDK1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),并可通过opt来查看这些进程的详细启动参数。
使用方式:
$>jps
4600
8600 Jps
5052 TestClass1
可用参数:
-m 输出传递给main方法的参数
$>jps -m
8464 Jps -m
4600
5052 TestClass1
-l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
$>jps -l
5552 sun.tools.jps.Jps
4600
5052 com.test.TestClass1
-v 输出传递给JVM的参数
$>jps -v
4600 -Dosgi.requiredJavaVersion=1.8 [email protected]/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m
10988 Jps -Denv.class.path=.;D:\soft\jdk1.8.0_65\lib\dt.jar;D:\soft\jdk1.8.0_65\lib\tools.jar; -Dapplication.home=D:\soft\jdk1.8.0_65 -Xms8m
5052 TestClass1 -Dfile.encoding=UTF-8
-lmv 组合输出
$>jps -lmv
4600 -Dosgi.requiredJavaVersion=1.8 [email protected]/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m
5052 com.test.TestClass1 -Dfile.encoding=UTF-8
7612 sun.tools.jps.Jps -lmv -Denv.class.path=.;D:\soft\jdk1.8.0_65\lib\dt.jar;D:\soft\jdk1.8.0_65\lib\tools.jar; -Dapplication.home=D:\soft\jdk1.8.0_65 -Xms8m
2. jinfo
jinfo 命令可以查看java进程的运行时jvm参数详细信息,例如最大堆内存、使用的什么垃圾收集器等
-flags pid 查看指定java进程的所有jvm运行参数
$>jinfo -flags 5052
Attaching to process ID 5052, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2122317824 -XX:MaxNewSize=707264512 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line: -Dfile.encoding=UTF-8
-flags [指定参数] pid 查看java进程指定jvm运行参数
$>jinfo -flag InitialHeapSize 5052
-XX:InitialHeapSize=134217728
3. jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量
-class pid查看java进程类加载统计
$>jstat -class 5052
Loaded Bytes Unloaded Bytes Time
1663 3061.7 0 0.0 0.37
-compiler pid查看java进程编译统计
$>jstat -compiler 5052
Compiled Failed Invalid Time FailedType FailedMethod
659 0 0 0.52 0
-gc pid查看java进程垃圾回收统计
$>jstat -gc 5052
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 33280.0 16650.3 87552.0 0.0 4480.0 767.4 384.0 75.8 0 0.000 0 0.000 0.00
-gccapacity pid查看java堆内存统计
$>jstat -gccapacity 5052
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
43520.0 690688.0 43520.0 5120.0 5120.0 33280.0 87552.0 1381888.0 87552.0 87552.0 0.0 1056768.0 4480.0 0.0 1048576.0 384.0 0 0
4. jmap
JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候自动生成dump文件。 jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。【内存分析】
-dump pid dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
$>jmap -dump:live,format=b,file=dump.hprof 5052
Dumping heap to C:\Users\jasonspears\Desktop\dump.hprof ...
Heap dump file created
-heap pid 打印heap的概要信息,GC使用的算法,heap的配置及使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
$>jmap -heap 5052
Attaching to process ID 5052, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2122317824 (2024.0MB)
NewSize = 44564480 (42.5MB)
MaxNewSize = 707264512 (674.5MB)
OldSize = 89653248 (85.5MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 34078720 (32.5MB)
used = 1022416 (0.9750518798828125MB)
free = 33056304 (31.524948120117188MB)
3.0001596304086537% used
From Space:
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
To Space:
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
PS Old Generation
capacity = 36175872 (34.5MB)
used = 1863752 (1.7774124145507812MB)
free = 34312120 (32.72258758544922MB)
5.151920042176178% used
5486 interned Strings occupying 442328 bytes.
-finalizerinfo pid 打印等待回收的对象信息
$>jmap -finalizerinfo 5052
Attaching to process ID 5052, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
Number of objects pending for finalization: 0
5. javap
javap是java class文件分解器,可以反编译(即对javac编译的文件进行反编译),也可以查看java编译器生成的字节码。用于分解class文件。
上一篇: 合格前端系列第九弹-前端面试那些事
下一篇: Android-通过URL获取网络资源