回收算法
- 标记清除算法
- 标记整理算法
- 复制回收算法
Minor GC
触发
- 当年轻代满的时候,都会触发Minor GC,这里的年轻代满指的是Eden区,Survivor满不会引发GC。
原理
- 那么Survivor的作用是啥呢?Suvivor分为From区和To区,我们知道Java堆里的老年代的作用,将长期使用的对象放入老年代。但是中间有个过度,这个就是Survivor区
- 那为啥要俩个(From区和To区)呢?刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生。
- Survivor可以晋升老年代,需要From区和To区来回复制的次数而定,这个是可以由虚拟机参数来设定的。
https://juejin.im/post/5b8d2a5551882542ba1ddcf8
垃圾回收收集器介绍 https://crowhawk.github.io/2017/08/15/jvm_3/
Full GC
触发
- 系统自己执行System.gc()方法
- 老年代空间不足
- 方法区空间不足
- 通过Minor GC后进入老年代的平均大小大于老年代的可用内存
- 由Eden区、survivor space1(From Space)区向survivor space2(To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
垃圾收集器
垃圾收集器可以按新生代和老年代来区分
- 新生代收集器
收集器 | 收集对象和算法 | 收集器类型 |
---|---|---|
Serial | 新生代 复制算法 | 单线程 |
ParNew | 新生代 复制算法 | 并行的多线程收集器 |
Parallel Scavenge | 新生代 复制算法 | 并行的多线程收集器 |
- 老年代收集器
收集器 | 收集对象和算法 | 收集器类型 |
---|---|---|
Serial old | 老年代 标记整理算法 | 单线程 |
Parallel old | 老年代 标记整理算法 | 并行的多线程收集器 |
CMS | 老年代 标记清除算法 | 并行与并发收集器 |
G1 | 老年代 跨新生代和老年代;标记整理和化整为0 | 并行与并发收集器 |