java堆内存结构
gc相关参数
1 | -Xms 10m:最小堆内存10M |
1 | -XX:NewRatio:新生代和老年代的比例 |
垃圾收集算法
- 标记-清除:先标记对象为不可达,然后回收内存,容易产生内存碎片
- 标记-压缩:先标记对象不可达,然后统一将可达对象移动到内存的一端,然后统一回收边界外所有内存。有效解决内存碎片的问题(适合老年代)
- 复制算法:针对新生代,将内存分为完全相同的两块,每次只用一块,gc时,将存活对象移到另一个空闲的内存块,然后清除整块内存。
gc垃圾收集器
- 串行收集器,单线程进行垃圾回收,新生代采用标记-复制算法,老年代采用标记-压缩算法
- 并行收集器ParNew:不适用于老年代,多个线程同时进行gc,采用标记-复制算法
- CMS并发标记清除收集器:只能用于老年代gc和应用程序并发执行,很少的时间会出现stop the world现象。不适用压缩算法。
串行收集器和cms对比图:
gc正常情况参考
1
2
3
4
5
6如果GC执行时间满足以下判断条件,那么GC调优并没那么必须。
Minor GC执行迅速(50毫秒以内)
Minor GC执行不频繁(间隔10秒左右一次)
Full GC执行迅速(1秒以内)
Full GC执行不频繁(间隔10分钟左右一次)
gc调试命令
1 | jstat: |
关键词解释:
以下容量的单位为kb,时间单位为秒
jstat -gc:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17S0C:年轻代中第一个 survivor 的容量
S1C:年轻代中第二个 survivor 的容量
S0U:年轻代中第一个 survivor 已经使用的空间
S1U:年轻代中第二个 survivor 已经使用的空间
EC:年轻代中 eden 的总容量
EU:年轻代中 eden 的已经使用容量
OC:老年代(old)区域的总容量
OU:老年代(old)区域已经使用的容量
MC:元数据(Metaspace)区大小
MU:元数据(Metaspace)区已经使用的空间
CCSC:压缩类空间的大小
CCSU:压缩类空间已经使用的大小
YGC:年轻代垃圾回收的次数
YGCT:年轻代垃圾回收所用的时间
FGC:full gc 的次数
FGCT:full gc 的总消耗时间
GCT:从程序启动到程序统计时,gc 的总消耗时间
jstat -gccapacity:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18NGCMN:年轻代(young)的初始化内存容量
NGCMX:年轻代(young)的最大内存容量
NGC:年轻代(young)当前的容量
S0C:当前 survivor 0 的容量
S1C:当前 survivo 1 的容量
EC:eden 的容量
OGCMN:老年代(old)的最小容量
OGCMX :老年代(old)的最大容量
OGC :老年代(old)当前的容量
OC:OGC=sum(all OC),hotspot中老年代空间个数为1个,年轻代为3个(eden,s0,s1),因此OGC==OC
MCMN:元数据(Metaspace)区的最小容量
MCMX: 元数据(Metaspace)区的最大容量
MC:元数据(Metaspace)区当前的容量
CCSMN:压缩类空间的最小容量
CCSMX:压缩类空间的最大容量
CCSC:压缩类空间的当前容量
YGC:年轻代 gc 次数
FGC:full gc 次数
jstat -gcutil1
2
3
4
5
6
7
8
9
10
11S0:survivo 1 当前所用的比例
S1: survivor 2 当前所用的比例
E:eden 区所使用的比例
O:老年代(old 区)所使用的比例
M:元数据(Metaspace)区 所使用的比例
CCS:压缩类使用的比例
YGC:年轻代 gc 的次数
YGCT:年轻代 gc 消耗的时间
FGC:full gc的次数
FGCT:full gc消耗的时间
GCT:gc 消耗的总时间
jstat -gccause:1
2
3与gcutil相比多了两列,上一次gc原因和当前gc原因。
LGCC:Last Garbage Collection Cause.上一次gc原因
GCC:Current Garbage Collection Cause.当前gc原因
gc问题
full gc频繁
full gc时间过久
young gc时间太久
young gc频繁