1. 查看垃圾收集器与java版本
java -XX:+PrintCommandLineFlags -version
java8并采用默认的Parallel垃圾收集器(采用分代收集算法)
java version "1.8.0_141"; UseParallelGC
2. 实时查看GC情况
查看服务对应进程与参数情况
ps aux | grep xxx.jar
xms起始堆内存4g,xmx最大堆内存4g,新生代大小3g
java -Xmx4g -Xms4g -Xmn3g(可通过适当调大新生代大小来进行优化,避免晋升老年代,不过这里值得商榷) -jar
通过jstat查看gc情况
jstat -gc [pid] [时间参数/毫秒]
参数解释
SOC # FromSurvivor区大小
S1C # ToSurvivo区大小
S0U # FromSurvivor区目前使用大小
S1U # ToSurvivor区目前使用大小
EC # Eden区大小
EU # Eden区目前使用大小
OC # 老年代大小
OU # 老年代目前已使用大小
MC # 方法区大小(元空间[jdk1.8及以上]或永久代)
MU # Eden区目前使用大小
YGC # YoungGC次数
YGCT # YoungGC时长
FGC # FullGC次数
FGCT # FullGC时长
我们知道分代收集算法中新生代垃圾收集采用标记复制算法
将Eden区+survivor区中存活的对象复制到另外一个survivor区,随后清空数据(存活的对象年龄+1,达到设定的值便会进入老年代,如果老年代内存不足将触发FullGC)
从图中可以看到YGC即youngGC后survivor区使用大小总有一个是0,这和标记复制算法预期一致。YGC几十秒触发一次,一次约20毫秒,FullGC约20分钟触发一次(没截),一次约几百毫秒。FullGC较为频繁,而YoungGC不频繁,可以降低新生代大小从而提高老年代大小避免频繁FullGC。