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来查看这些进程的详细启动参数。
使用方式:
1
2
3
4
5 1$>jps
24600
38600 Jps
45052 TestClass1
5
可用参数:
-m 输出传递给main方法的参数
1
2
3
4
5 1$>jps -m
28464 Jps -m
34600
45052 TestClass1
5
-l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
1
2
3
4
5 1$>jps -l
25552 sun.tools.jps.Jps
34600
45052 com.test.TestClass1
5
-v 输出传递给JVM的参数
1
2
3
4
5 1$>jps -v
24600 -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m
310988 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
45052 TestClass1 -Dfile.encoding=UTF-8
5
-lmv 组合输出
1
2
3
4
5 1$>jps -lmv
24600 -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m
35052 com.test.TestClass1 -Dfile.encoding=UTF-8
47612 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
5
2. jinfo
jinfo 命令可以查看java进程的运行时jvm参数详细信息,例如最大堆内存、使用的什么垃圾收集器等
-flags pid 查看指定java进程的所有jvm运行参数
1
2
3
4
5
6
7
8 1$>jinfo -flags 5052
2Attaching to process ID 5052, please wait...
3Debugger attached successfully.
4Server compiler detected.
5JVM version is 25.65-b01
6Non-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
7Command line: -Dfile.encoding=UTF-8
8
-flags [指定参数] pid 查看java进程指定jvm运行参数
1
2
3 1$>jinfo -flag InitialHeapSize 5052
2-XX:InitialHeapSize=134217728
3
3. jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量
-class pid查看java进程类加载统计
1
2
3
4 1$>jstat -class 5052
2Loaded Bytes Unloaded Bytes Time
3 1663 3061.7 0 0.0 0.37
4
-compiler pid查看java进程编译统计
1
2
3
4 1$>jstat -compiler 5052
2Compiled Failed Invalid Time FailedType FailedMethod
3 659 0 0 0.52 0
4
-gc pid查看java进程垃圾回收统计
1
2
3
4 1$>jstat -gc 5052
2 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
35120.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
4
-gccapacity pid查看java堆内存统计
1
2
3
4 1$>jstat -gccapacity 5052
2 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
3 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
4. jmap
JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候自动生成dump文件。 jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。【内存分析】
-dump pid dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
1
2
3
4 1$>jmap -dump:live,format=b,file=dump.hprof 5052
2Dumping heap to C:\Users\jasonspears\Desktop\dump.hprof ...
3Heap dump file created
4
-heap pid 打印heap的概要信息,GC使用的算法,heap的配置及使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 1$>jmap -heap 5052
2Attaching to process ID 5052, please wait...
3Debugger attached successfully.
4Server compiler detected.
5JVM version is 25.65-b01
6
7using thread-local object allocation.
8Parallel GC with 4 thread(s)
9
10Heap Configuration:
11 MinHeapFreeRatio = 0
12 MaxHeapFreeRatio = 100
13 MaxHeapSize = 2122317824 (2024.0MB)
14 NewSize = 44564480 (42.5MB)
15 MaxNewSize = 707264512 (674.5MB)
16 OldSize = 89653248 (85.5MB)
17 NewRatio = 2
18 SurvivorRatio = 8
19 MetaspaceSize = 21807104 (20.796875MB)
20 CompressedClassSpaceSize = 1073741824 (1024.0MB)
21 MaxMetaspaceSize = 17592186044415 MB
22 G1HeapRegionSize = 0 (0.0MB)
23
24Heap Usage:
25PS Young Generation
26Eden Space:
27 capacity = 34078720 (32.5MB)
28 used = 1022416 (0.9750518798828125MB)
29 free = 33056304 (31.524948120117188MB)
30 3.0001596304086537% used
31From Space:
32 capacity = 5242880 (5.0MB)
33 used = 0 (0.0MB)
34 free = 5242880 (5.0MB)
35 0.0% used
36To Space:
37 capacity = 5242880 (5.0MB)
38 used = 0 (0.0MB)
39 free = 5242880 (5.0MB)
40 0.0% used
41PS Old Generation
42 capacity = 36175872 (34.5MB)
43 used = 1863752 (1.7774124145507812MB)
44 free = 34312120 (32.72258758544922MB)
45 5.151920042176178% used
46
475486 interned Strings occupying 442328 bytes.
48
-finalizerinfo pid 打印等待回收的对象信息
1
2
3
4
5
6
7 1$>jmap -finalizerinfo 5052
2Attaching to process ID 5052, please wait...
3Debugger attached successfully.
4Server compiler detected.
5JVM version is 25.65-b01
6Number of objects pending for finalization: 0
7
5. javap
javap是java class文件分解器,可以反编译(即对javac编译的文件进行反编译),也可以查看java编译器生成的字节码。用于分解class文件。