文章目录
前言
说到jvm调优,之前分享了如何使用MAT工具分析堆内存溢出,正是这样,按照以往的原则,不能就这样浅尝辄止,并且之前面试的时候经常被问到,jvm这方面的知识,于是网上搜了很多资料来学习,总结了下一些简单的命令,如果写的不好或者有误的地方,请大家多多指教,评论区请及时指出,我也立即响应。
-XX参数
-XX参数也是非标准参数,主要用于jvm的调优和debug操作。
-XX参数的使用有2种方式,一种是boolean类型,一种是非boolean类型:
- boolean类型
- 格式:-XX:[±]
- 如:-XX:+DisableExplicitGC 表示禁用手动调用gc操作,也就是说调用 System.gc()无效
- 非boolean类型
- 格式:-XX:
- 如:-XX:NewRatio=1 表示新生代和老年代的比值
[root@localhost test]# java -showversion -XX:+DisableExplicitGC Main
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)
hello jvm
-Xms与-Xmx参数
-Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大堆内存。
-
-Xmx2048m:等价于-XX:MaxHeapSize,设置JVM大堆内存为2048M。
-
-Xms512m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M。
适当的调整jvm的内存大小,可以充分利用服务器资源,让程序跑的更快。
[root@localhost test]# java -Xms512m -Xmx2048m Main
hello jvm
查看jvm的运行参数
运行java命令时打印出运行参数
[root@localhost test]# java -XX:+PrintFlagsFinal -version
[Global flags]
intx ActiveProcessorCount = -1 {product}
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product}
uintx AdaptiveSizePolicyInitializingSteps = 20 {product}
uintx AdaptiveSizePolicyOutputInterval = 0 {product}
查看正在运行的java进程的参数
如果想要查看正在运行的jvm就需要借助于jinfo命令查看。
首先,启动一个tomcat用于测试,来观察下运行的jvm参数。
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.99/bin/apache-tomcat-7.0.99.tar.gz
tar -xzvf apache-tomcat-7.0.99.tar.gz
cd apache-tomcat-7.0.99
cd bin/
./startup.sh
jps命令
JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
jps [options] [hostid]
option参数
- -l : 输出主类全名或jar路径
- -q : 只输出LVMID
- -m : 输出JVM启动时传递给main()的参数
- -v : 输出JVM启动时显示指定的JVM参数
其中[option]、[hostid]参数也可以不写。
#通过jps 或者 jps ‐l 查看java进程
[root@localhost bin]# jps -l
13618 org.apache.catalina.startup.Bootstrap
13693 sun.tools.jps.Jps
[root@localhost bin]# jinfo -flags 13618
Attaching to process ID 13618, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.232-b09
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=31457280 -XX:MaxHeapSize=482344960 -XX:MaxNewSize=160759808 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=10485760 -XX:OldSize=20971520 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
Command line: -Djava.util.logging.config.file=/root/test/apache-tomcat-7.0.99/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/root/test/apache-tomcat-7.0.99 -Dcatalina.home=/root/test/apache-tomcat-7.0.99 -Djava.io.tmpdir=/root/test/apache-tomcat-7.0.99/temp
#查看某一参数的值,用法:jinfo ‐flag <参数名> <进程id>
[root@localhost bin]# jinfo -flag MaxHeapSize 13618
-XX:MaxHeapSize=482344960
jstat
jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
jstat [option] LVMID [interval] [count]
参数
- [option] : 操作参数
- LVMID : 本地虚拟机进程ID
- [interval] : 连续输出的时间间隔
- [count] : 连续输出的次数
查看class加载统计
[root@localhost bin]# jps
13728 Jps
13618 Bootstrap
[root@localhost bin]# jstat -class 13618
Loaded Bytes Unloaded Bytes Time
3066 6918.1 0 0.0 3.86
说明:
- Loaded:加载class的数量
- Bytes:所占用空间大小 Unloaded:未加载数量
- Bytes:未加载占用空间
- Time:时间
查看编译统计
[root@localhost bin]# jstat -compiler 13618
Compiled Failed Invalid Time FailedType FailedMethod
2099 2 0 5.44 1 com/sun/org/apache/xerces/internal/parsers/AbstractDOMParser startElement
说明:
- Compiled:编译数量。
- Failed:失败数量
- Invalid:不可用数量
- Time:时间
- FailedType:
- 失败类型 FailedMethod:失败的方法
垃圾回收统计
[root@localhost bin]# jstat -gc 13618
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1024.0 1024.0 0.0 1024.0 8448.0 7707.9 20936.0 13069.8 22704.0 22142.4 2304.0 2117.6 15 0.138 1 0.076 0.215
#也可以指定打印的间隔和次数,每1秒中打印一次,共打印5次
[root@localhost bin]# jstat -gc 13618 1000 5
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1024.0 1024.0 0.0 1024.0 8448.0 7802.6 20936.0 13069.8 22704.0 22142.4 2304.0 2117.6 15 0.138 1 0.076 0.215
1024.0 1024.0 0.0 1024.0 8448.0 7802.6 20936.0 13069.8 22704.0 22142.4 2304.0 2117.6 15 0.138 1 0.076 0.215
1024.0 1024.0 0.0 1024.0 8448.0 7802.6 20936.0 13069.8 22704.0 22142.4 2304.0 2117.6 15 0.138 1 0.076 0.215
1024.0 1024.0 0.0 1024.0 8448.0 7802.6 20936.0 13069.8 22704.0 22142.4 2304.0 2117.6 15 0.138 1 0.076 0.215
1024.0 1024.0 0.0 1024.0 8448.0 7802.6 20936.0 13069.8 22704.0 22142.4 2304.0 2117.6 15 0.138 1 0.076 0.215
C即Capacity 总容量,U即Used 已使用的容量
- S0C : survivor0区的总容量
- S1C : survivor1区的总容量
- S0U : survivor0区已使用的容量
- S1U : survivor1区已使用的容量
- EC : Eden区的总容量
- EU : Eden区已使用的容量
- OC : Old区的总容量
- OU : Old区已使用的容量
- PC 当前perm的容量 (KB)
- PU perm的使用 (KB)
- YGC : 新生代垃圾回收次数
- YGCT : 新生代垃圾回收时间
- FGC : 老年代垃圾回收次数
- FGCT : 老年代垃圾回收时间
- GCT : 垃圾回收总消耗时间
jmap的使用以及内存溢出分析
前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容, 如:内存使用情况的汇总、对内存溢出的定位与分析。
命令格式:
jmap [option] LVMID
option参数:
- dump : 生成堆转储快照
- finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
- heap : 显示Java堆详细信息
- histo : 显示堆中对象的统计信息
- permstat : to print permanent generation statistics
- F : 当-dump没有响应时,强制生成dump快照
查看内存使用情况
[root@localhost bin]# jps -l
13174 org.apache.catalina.startup.Bootstrap
13212 sun.tools.jps.Jps
[root@localhost bin]# jmap -heap 13174
Attaching to process ID 13174, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.232-b09
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration: #堆内存配置信息
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 482344960 (460.0MB)
NewSize = 10485760 (10.0MB)
MaxNewSize = 160759808 (153.3125MB)
OldSize = 20971520 (20.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: # 堆内存的使用情况
New Generation (Eden + 1 Survivor Space): #年轻代
capacity = 9437184 (9.0MB)
used = 7125520 (6.7954254150390625MB)
free = 2311664 (2.2045745849609375MB)
75.50472683376736% used
Eden Space:
capacity = 8388608 (8.0MB)
used = 6076952 (5.795433044433594MB)
free = 2311656 (2.2045669555664062MB)
72.44291305541992% used
From Space:
capacity = 1048576 (1.0MB)
used = 1048568 (0.9999923706054688MB)
free = 8 (7.62939453125E-6MB)
99.99923706054688% used
To Space:
capacity = 1048576 (1.0MB)
used = 0 (0.0MB)
free = 1048576 (1.0MB)
0.0% used
tenured generation: # 老年代
capacity = 20971520 (20.0MB)
used = 12570176 (11.98785400390625MB)
free = 8401344 (8.01214599609375MB)
59.93927001953125% used
13359 interned Strings occupying 1148672 bytes.
查看内存中对象数量及大小
#查看所有对象,包括活跃以及非活跃的 jmap ‐histo <pid> | more
#查看活跃对象 jmap ‐histo:live <pid> | more
[root@localhost bin]# jps -l
13235 sun.tools.jps.Jps
13174 org.apache.catalina.startup.Bootstrap
[root@localhost bin]# jmap -histo:live 13174 | more
num #instances #bytes class name
----------------------------------------------
1: 26236 3667880 [C
2: 1842 2354584 [B
3: 2252 925464 [I
4: 25374 608976 java.lang.String
5: 5702 501776 java.lang.reflect.Method
6: 15660 501120 java.util.HashMap$Node
7: 5249 307992 [Ljava.lang.Object;
8: 2595 293872 java.lang.Class
9: 830 186184 [Ljava.util.HashMap$Node;
10: 4669 149408 java.util.concurrent.ConcurrentHashMap$Node
11: 5846 127496 [Ljava.lang.Class;
12: 1946 77840 java.util.LinkedHashMap$Entry
13: 1043 70344 [Ljava.lang.String;
14: 1463 70224 java.util.HashMap
15: 1351 64848 org.apache.tomcat.util.digester.CallMethodRule
16: 2655 63720 java.util.ArrayList
17: 1671 53472 com.sun.org.apache.xerces.internal.xni.QName
18: 3264 52224 java.lang.Object
19: 66 49728 [Ljava.util.concurrent.ConcurrentHashMap$Node;
20: 335 45296 [Ljava.lang.reflect.Method;
21: 1072 42880 java.lang.ref.Finalizer
22: 866 41568 org.apache.tomcat.util.modeler.AttributeInfo
23: 1109 35488 java.util.Hashtable$Entry
24: 655 31440 java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync
25: 376 27072 java.lang.reflect.Field
26: 324 25920 java.lang.reflect.Constructor
27: 344 24768 java.util.logging.Logger
#对象说明
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象
将内存使用情况dump到文件
[root@localhost test]# jmap -dump:format=b,file=./dump.dat 13174
Dumping heap to /root/test/dump.dat ...
Heap dump file created
[root@localhost test]# ll
total 27672
drwxr-xr-x. 9 root root 220 Jan 3 23:22 apache-tomcat-7.0.99
-rw-r--r--. 1 root root 9587605 Dec 11 21:44 apache-tomcat-7.0.99.tar.gz
-rw-------. 1 root root 18737999 Jan 4 16:52 dump.dat
-rw-r--r--. 1 root root 433 Jan 3 23:23 Main.class
-rw-r--r--. 1 root root 135 Jan 3 23:23 Main.java
通过jhat对dump文件进行分析
[root@localhost test]# jhat -port 9999 ./dump.dat
Reading from ./dump.dat...
Dump file created Sat Jan 04 16:52:27 CST 2020
Snapshot read, resolving...
Resolving 168454 objects...
Chasing references, expect 33 dots.................................
Eliminating duplicate references.................................
Snapshot resolved.
Started HTTP server on port 9999
Server is ready.