0. jvm垃圾回收的基本概念
0.1 什么是垃圾,主要是堆,堆是完全二叉树结构
引用计数法
可达性分析,解决引用计数法循环依赖问题
0.2常用垃圾回收算法
基本策略
标记清除
标记复制(年轻代8:1:1)
标记整理(年老代)
分代收集
CMS
G1
1.查看进程
1.1 ps -ef|grep 部分jar包名 |grep -v 'grep'|awk '{ print $2}'
1.2 jps也可以,前提是你知道进程的名字
2.查看堆信息
2.1 jmap -heap pid 可以查看具体分配多少,垃圾回收器的类型
2.2 jinfo pid |grep 'Command line' 查看启动jar时jvm参数
Command line: -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
备注:-XX:NewRatio=4 新生代与老年代的比值 1:4
-XX:ServerRatio=8 两个Survivor与Endn的比值 8:1:1
-Xmn:年轻代大小 256 1:4 年老代
CurenSwapMap 年老代并行收集器 ,标记清除,最小系统停顿
Parrell 年轻代并行收集
-XX:MetaspaceSize=128m 扩容时才用,java8的元空间Metaspace扩容到MetaspaceSize时发生FGC,默认初始是20.8,
3.查看gc情况
3.1jstat -gcutil pid
[centos@s221 /opt/arthasluo]$jstat -gcutil 65887
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
100.00 0.00 25.20 2.81 96.40 94.59 8 0.180 0 0.000 0.180
重点看FGC FGCT两个值 ,触发FGC(年老代,Metaspace(jdk1.8之前用永久代),显示调用System.gc())
3.2用arthas查看,
启动java -jar Arthas-boot.jar pid
jvm
4.打印和分析GC日志
-XX:+PrintGCDetails:打印详细GC信息,例如[GC [PSYoungGen: 46080K->7677K(53760K)] 46080K->9721K(186880K), 0.0109905 secs]
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式,例如上一行中的2.002)
-XX:+PrintGCDateStamps
打印样例:2.002: [GC [PSYoungGen: 46080K->7677K(53760K)] 46080K->9721K(186880K), 0.0109905 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
(1)2.002:时间戳
(2)[PSYoungGen: 46080K->7677K(53760K)]:年轻代GC回收前大小—>回收后大小(总大小)
(3)46080K->9721K(186880K):整个堆GC回收前大小—>回收后大小(总大小)
(4)0.0109905 secs:Minor GC耗费时间
(5)[Times: user=0.03 sys=0.00, real=0.01 secs]:real表示GC实际耗费时间,user表示耗费所有CPU时间总和。注意在SerialGC中只有一个线程(CPU)执行GC,所以user=real,但是在Parallel GC中,有多个CPU参与GC,所以相对于Serial GC,real会缩短,user会增大