Garbage Collection
GC
是垃圾回收线程,与之对应的是用户线程. 收集垃圾时STW
Stop The World,进行检索垃圾,会导致用户线程暂停,影响应用。JVM
在进行GC
时,并非每次都对三个内存Young、Old、method area
区域一起回收,大部分时候回收指Young区
针对Hotspot JVM
实现,GC
按照回收区域分为两大类型
- 部分收集
partial GC
:不是完整收集整个heap area
的垃圾收集- 新生代收集
Minor GC/Young GC
: 只是Young区
Eden区、s0或s1
的垃圾收集 - 老年代收集
Major GC/Old GC
: 只是Old区
的垃圾收集- 目前只有 Concurrent并发Mark Sweep
CMS
Collector会有单独收集老年代的行为 - 注意,很多时候
Major GC
会和Full GC
混淆使用,需要具体分辨是Old区
回收还是整堆
回收
- 目前只有 Concurrent并发Mark Sweep
- 混合收集
Mixed GC
:收集整个新生代以及部分老年代的垃圾收集- 目前只有Garbage-First
G1
Garbage Collector.会有这种行为
- 目前只有Garbage-First
- 新生代收集
- 整堆收集
Full GC
: 收集整个heap area
和method area
的垃圾收集
调优就是减少GC出现次数. 主要调优Major GC
和Full GC
Minor GC
- 当
Eden
区满触发 Survivor
区满不会引发MinorGC
- 每次
MinorGC
会清理Young区
Eden区、s0或s1
MinorGC
非常频繁- 回收速度快
- 会引发
STW
Stop The World,暂停其他用户线程,等待垃圾回收结束,用户线程才恢复运行
Major GC
- 对象从
Old区
消失时,则发生了Major GC
或Full GC
- 出现
Major GC
经常会伴随至少一次的MinorGC
但非绝对,在Parallel Scavenge
收集器的收集策略里直接进行MajorGC
的策略选择过程- 当
Old区
不足时,会先尝试触发MinorGC
,如果之后空间还不足,则触发MajorGC
- 当
Major GC
比Minor GC
慢10倍以上,STW
的时间更长Major GC
后内存还不足,会抛出OOM
异常
Full GC
- 触发机制
- 调用
System.gc()
时,系统建议执行Full GC
,但是不必然执行 Old区
空间不足method area
空间不足- 通过
Minor GC
后晋升Old区
的对象平均大小,大于Old区
的可用内存 - 由
Eden区
和Survivor Form区
向Survivor To区
复制时,对象大小大于Survivor To区
可用内存,则把该对象转存到Old区
,且Old区
的可用内存小于该对象大小
- 调用
- 说明:
Full GC
是开发或调优中尽量要避免的,这样STW
时间会短一些