jvm调优科普篇
常用垃圾回收器
- CMS
- G1
- ZGC
通过如下命令,可以查看垃圾回收器的使用情况
1 | $ java -XX:+PrintCommandLineFlags -version |
jdk1.8 如下:
1 | -XX:InitialHeapSize=534944128 |
jdk1.8 -XX:+UseParallelGC
默认使用的是Parallel垃圾回收器
jdk11 如下:
1 | -XX:G1ConcRefinementThreads=10 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=534944128 -XX:MaxHeapSize=8559106048 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation |
jdk11 -XX:+UseG1GC
默认使用的垃圾回收器是G1
理解JVM垃圾回收有用的资源
jvm启动参数
java启动参数共分为三类;
其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
常用非标准参数
通过 java -X
可以查看支持的非标准参数
1 | -Xms6g //最小堆 |
常用非Stable参数
通过java -XX:+PrintFlagsFinal -version
可以查看支持的非Stable参数
-XX:+<option>
:代表启用 true-XX:-<option>
:代表禁用 false
1 | -XX:+PrintGC |
G1
G1全称为Garbage-First,意为垃圾优先,哪一块的垃圾最多就优先清理它。
常用参数
1 | -XX:+UseG1GC //使用G1回收器 |
ZGC
ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括:
- 停顿时间不超过10ms;
- 停顿时间不会随着堆的大小,或者活跃对象的大小而增加;
- 支持8MB~4TB级别的堆(未来支持16TB)。
1 | -XX:+UnlockExperimentalVMOptions -XX:+UseZGC |
超低延迟(TP999 < 20ms)和高延迟(TP999 > 200ms)服务收益不大,吞吐量优先的场景,ZGC可能并不适合。
更多信息参考:新一代垃圾回收器ZGC的探索与实践
jvm性能查看工具
jstat
利用jvm内建的指令对java应用程序的资源和性能进行实时的命令行监控,包括针对heap size和垃圾回收情况的监控
1 | $ jstat -gc 14724 1000 2 //间隔1s,统计两次 |
参数含义:
S0C:年轻代的第一个survicor(幸存区)的容量(字节)
S1C:年轻代的第二个survicor(幸存区)的容量(字节)
S0U:年轻代的第一个survicor(幸存区)已经使用的空间(字节)
S1U:年轻代的第二个survicor(幸存区)已经使用的空间(字节)
EC:年轻代中的Eden(伊甸园)的容量
EU:年轻代中的Een(伊甸园)已经使用的容量
OC:年老代的容量
OU:年老代已经使用的空间
MC:metadata的容量
MU:metadata已经使用的空间
CCSC:压缩类空间的大小
CCSU:压缩类空间的使用大小
YG:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时年老代gc次数
FGCT:从应用程序启动到采样时年老代(全gc)gc所用时间(s)
GC: 从应用程序启动到采样时gc用的总时间(s)
jmap
查看jvm的内存分配情况
1 | $ jmap -heap 14724 |
jstack
查看java程序的线程运行情况
1 | $ jstack 14724 |
jinfo
1 | $ jinfo 14724 //查看jvm系统详细参数及环境变量 |
最佳实践
输出GC日志
jdk11
1 | java -Xlog:gc*:file=gc.log,filecount=10,filesize=10m |
jdk8
1 | -XX:+PrintGCDetails -Xloggc:<PATH_TO_GC_LOG_FILE> |
dump
1 | #出现 OOM 时生成堆 dump: |