JVM性能调优命令
常用命令
-
jps
-
java process status
-
jps -l 主类全名
-
jps -m 运行传入主类的参数
-
jps -v 虚拟机参数
-
[guaoran@localhost ~]$ sudo jps -mlv 6753 /mnt/data/apps/demo.jar --server.port=8080 -Dfile.encoding=utf-8 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms4g -Xmx4g -Xss1m -XX:SurvivorRatio=8
-
-
jstat
-
类加载,内存,垃圾收集,jit编译信息。官方文档
-
[guaoran@localhost ~]$ sudo jstat -gcutil 6753 2000 3 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 55.23 0.00 54.03 0.01 95.78 93.86 2 0.235 0 0.000 0.235 55.23 0.00 54.03 0.01 95.78 93.86 2 0.235 0 0.000 0.235 55.23 0.00 54.03 0.01 95.78 93.86 2 0.235 0 0.000 0.235
-
-
jinfo
-
实时调整和查看虚拟机参数
-
查看JVM参数
[gucheng@localhost ~]$ sudo jinfo -flags 6753 Attaching to process ID 6753, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=4294967296 -XX:MaxHeapSize=4294967296 -XX:MaxMetaspaceSize=268435456 -XX:MaxNewSize=1431306240 -XX:MetaspaceSize=268435456 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1431306240 -XX:OldSize=2863661056 -XX:SurvivorRatio=8 -XX:ThreadStackSize=1024 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC Command line: -Dfile.encoding=utf-8 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms4g -Xmx4g -Xss1m -XX:SurvivorRatio=8
-
实时调整JVM参数
[gucheng@localhost ~]$ sudo jinfo -flag PrintGC 6753 -XX:-PrintGC [gucheng@localhost ~]$ sudo jinfo -flag PrintGCDetails 6753 -XX:-PrintGCDetails [gucheng@localhost ~]$ sudo jinfo -flag PrintGCTimeStamps 6753 -XX:-PrintGCTimeStamps [gucheng@localhost ~]$ sudo jinfo -flag +PrintGC 6753 [gucheng@localhost ~]$ sudo jinfo -flag +PrintGCDetails 6753 [gucheng@localhost ~]$ sudo jinfo -flag +PrintGCTimeStamps 6753 [gucheng@localhost ~]$ sudo jinfo -flag PrintGC 6753 -XX:+PrintGC
-
-
jmap
-
查看整个JVM内存状态
-
jmap -dump:formart=b,file=filepath pid
-
堆内存 dump
sudo jmap -dump:format=b,file=/mnt/users/guaoran/dpmanage.hprof 6753
-
打印当前java堆中各个对象的数量、大小。如果添加了live,只会打印活跃的对象。
sudo jmap -histo 6753 > ./log.txt
-
打印java堆的配置情况和使用情况,还有使用的GC算法。
[gucheng@localhost ~]$ sudo jmap -heap 6753 Attaching to process ID 6753, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 4294967296 (4096.0MB) NewSize = 1431306240 (1365.0MB) MaxNewSize = 1431306240 (1365.0MB) OldSize = 2863661056 (2731.0MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 268435456 (256.0MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 268435456 (256.0MB) G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 1145044992 (1092.0MB) used = 800942376 (763.8381729125977MB) free = 344102616 (328.16182708740234MB) 69.94855063302177% used From Space: capacity = 143130624 (136.5MB) used = 1383848 (1.3197402954101562MB) free = 141746776 (135.18025970458984MB) 0.9668427072601877% used To Space: capacity = 143130624 (136.5MB) used = 0 (0.0MB) free = 143130624 (136.5MB) 0.0% used PS Old Generation capacity = 2863661056 (2731.0MB) used = 348088896 (331.96343994140625MB) free = 2515572160 (2399.0365600585938MB) 12.155380444577307% used 34802 interned Strings occupying 3989888 bytes. [gucheng@localhost ~]$
-
-
jstack
-
主要用来查看Java线程的调用堆栈的,可以用来分析线程问题
-
sudo jstack 6753 > ./jstack.txt
-
将线程ID转换成十六进制
printf "%x\n" 2866
-
jconsole 和jvisualVM 监控远程应用(开放端口不行,把防火墙关了)
java -Djava.rmi.server.hostname=192.168.20.60 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar xxx.jar
-
JVM 参数设置
-
线程栈内存设置
(
-XX:ThreadStackSize
)-Xss
是指设定每个线程的堆栈大小,默认(JDK5.0+)1M -
堆内存设置(逻辑上:堆内存=老年代堆内存+新生代堆内存+非堆[方法区(1.8是元空间)])
(
-XX:InitialHeapSize
)-Xms
初始化堆内存,(
-XX:MaxHeapSize
)-Xmx
最大分配堆内存 ,建议 -Xms与-Xmx相同,why?
其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。
如果二者不等,最开始的时候堆大小是Xms,随着heap内存消耗,jvm很有可能需要申请更大的空间直到Xmx;相似的,jvm在申请到Xmx空间时可能又用不了,这时会缩小jvm空间,这样,虽然可以动态调整jvm堆申请的大小,但是每一次调整都需要一定的系统开销(jvm与os之间)。
-
老年代堆内存设置
-XX:OldSize
: 表示老年代初始内存的大小。 -
新生代堆内存设置
-XX:NewSize
:表示新生代初始堆内存的大小,应该小于-Xms的值;-XX:MaxNewSize
:表示新生代最大堆内存,应该小于-Xmx的值-Xmn
:表示同时设置新生代的初始化堆内存大小和新生代最大堆内存大小相同(-XX:NewSize
=-XX:MaxNewSize
=-Xmn
)-
设置新生代Eden和Survivor(S0,S1)的比值,即:Eden:s0:s1=8:1:1
-XX:SurvivorRatio
: 表示新生代Eden和Survivor划分比例,默认是8
-
-
设置老年代堆内存与新生代堆内存的比值,默认2
-XX:NewRatio
:为老年代与新生代的大小比值,默认为2,即:-XX:OldSize/-XX:MaxNewSize=2
-
非堆(方法区)元空间堆内存设置
-XX:MetaspaceSize
:表示元空间初始堆内存大小-XX:MaxMetaspaceSize
:表示元空间最大堆内存大小
设置元空间初始大小和最大大小为256M,堆初始化大小和最大大小为4G,栈内存默认1M,新生代Eden和Survivor比例默认为8(此时未显示的默认值-XX:NewRatio=2
,即:新生代 -XX:MaxNewSize
=1/3 -XX:MaxHeapSize
, -XX:OldSize
=2/3 -XX:OldSize
) 这块的证明是堆内存=新生代堆内存+老年代堆内存 (物理上)
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms4g -Xmx4g -Xss1m -XX:SurvivorRatio=8