0、垃圾回收算法
1.标记清除
2.标记复制
3.标记整理
内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记清除算法>标记压缩算法
内存利用率:复制算法<标记清除算法=标记压缩算法
年轻代:
- 存活率低
- 复制算法
老年代:
- 区域大,存活率高
- 标记清除(内存碎片不是太多)+标记压缩共同实现
1、垃圾回收器的分类
(1)串行
单线程:垃圾回收发生的时候,其它线程都暂停
适用于堆内存较小的时候,适合个人电脑
(2)吞吐量优先
多线程
适合于堆内存较大,需要多核CPU
让单位时间内STW的时间最短
(3)响应时间优先
多线程
适合于堆内存较大,需要多核CPU
注重的是垃圾回收时STW的时间最短
2、串行垃圾回收器
Serial:工作在新生代,采用的是复制算法
SerialOld:工作在老年代,采用的是标记整理算法
垃圾回收的时候此线程不阻塞,其他线程都处于阻塞状态
3、吞吐量优先
并行回收器
UseParalleGC:Paralle是并行的意思,UseParalleGC工作在新生代,采用复制算法
UseParalleoldGC:工作在老年代,采用标记整理算法
只要打开一个,另外一个就默认开启
-XX:+UseAdaptiveSizePolicy:自动调整伊甸园区和幸存区的比例
-XX:+GCTimeRatio=ratio:1/(1+radio)垃圾处理的目标(radio默认为99)
-XX:MaxGCPauseMillis=ms:最大暂停(默认200ms)
-XX:ParallelGCThreads=n:垃圾处理线程的数量
4、响应时间优先
兼顾前面的两种
-XX:UseConcMarkSweepGC:工作在老年代
-XX:+UseParNewGC:工作在新生代
初始标记:标记根对象,较快
并发标记:不用STW,和用户线程并发执行
并发清理:和其他用户线程并发执行
缺点:会产生碎片
5、G1(Garbage First,jdk9默认)
(1)适用场景
同时注重吞吐量和低延迟,默认的暂停目标是200ms
超大堆内存,会将堆划分为多个region
整体上是标记+整理算法,两个区域之间是复制算法
(2)垃圾回收阶段
Young Collection:对新生代的垃圾收集
每一个区域都可以单独作为伊甸园区、幸存区和老年代
新生代垃圾回收:复制算法,会STW,将幸存的对象拷贝到幸存区:
晋升到老年代:
Young Collection+Concurrent Mark:新生代的垃圾收集+并发标记(老年代垃圾超过阈值)
会进行初始标记(标记根对象)和并发标记(从根对象出发,标记其它的一些对象,老年代超过阈值触发)
Mixed Collection:混合收集(对新生代、老年代进行垃圾收集,规模较大)
老年代采用的也是复制算法,G1根据最大暂停时间有选择地进行垃圾回收。达不到设置的最大暂停时间,会从老年代挑出回收价值最高的区域
6、Full GC
其中CMS和G1老年代内存不足,分两种情况,对于G1当老年代的内存超过阈值的时候就会触发并发标记和混合收集,如果回收的速度高于用户线程产生垃圾的速度的话,这个时候还处于并发垃圾收集的阶段,还不是Full GC。当垃圾回收的速度赶不上垃圾收集的速度,就会退化为串行的收集,触发Full GC
CMS是并发收集失败的时候才会触发Full GC