java gc学习

java堆内存结构

java堆内存结构

gc相关参数

1
2
3
-Xms 10m:最小堆内存10M
-Xmx 10G:最大堆内存10G
-Xmn 10m:新生代大小10M
1
2
3
-XX:NewRatio:新生代和老年代的比例
-XX:SurvivorRatio:s0、s1和eden的比例
-XX:NewSize:新生代大小

垃圾收集算法

  • 标记-清除:先标记对象为不可达,然后回收内存,容易产生内存碎片
  • 标记-压缩:先标记对象不可达,然后统一将可达对象移动到内存的一端,然后统一回收边界外所有内存。有效解决内存碎片的问题(适合老年代
  • 复制算法:针对新生代,将内存分为完全相同的两块,每次只用一块,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
2
3
4
5
6
7
8
9
10
11
12
13
jstat:

命令格式:jstat - [-t] [-h] []]
其中:
option:
class:加载的类的数量及大小统计
gc:查看gc的次数和各个代容量大小及当前使用量,可以查看堆空间分配的容量大小
gccapacity:显示三代对象内存的使用情况,当前使用大小和总容量大小
gcutil:统计gc信息,各个堆内存剩余空间百分比,gc次数及时间。无法查看各个堆空间的大小
gcnew:查看年轻代gc统计信息
gcnewcapacity:查看年轻代空间容量统计信息
gcold:老年代gc统计信息
gcoldcapacity:老年代空间容量统计信息

关键词解释
以下容量的单位为kb,时间单位为秒
jstat -gc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
S0C:年轻代中第一个 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
18
NGCMN:年轻代(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 -gcutil

1
2
3
4
5
6
7
8
9
10
11
S0: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频繁