引用计数 入度 不等于0 说明有人在引用
循环引用 入度不等于 但这两个对象相互引用
可达性分析 GC root 达到或间接到达的对象 就不是垃圾对象
graph reachable unreachable
可达性分的算法标记reachable unreachable
mark标记
sweep清除
标记-清除算法
特点 遍历整个堆内存空间 比较耗时 会有空间碎片
标记-整理
compact move 比上面的算法消耗更多时间 但碎片少了
解决fragmented问题
标记 复制
UseSerialGC
单线程垃圾收集
适合单核CPU场景
适用场景:CPU核数比较少 内存空间较少 100M
新老年代之分 新生代用复制算法 老年代用标记整理算法
灰色 stop the world
垃圾收集线程会暂停业务代码线程
影响: 客户端响应时间变慢
如果业务代码线程继续执行 意味可能获取到一些垃圾对象
因为堆中的对象地址可能会变动 不能让业务代码线程一直使用
Parallel GC
并行的GC grabage collection
依然有stw
多线程收集
也有新老年代收集器
cms GC
concurrent mark sweep gc
只适用于老年代
停顿时间相对比较短
500ms左右
G First
停顿时间 并且很好的解决空间碎片问题
适用于新老年代
理想停顿时间200ms左右
Z GC
停顿时间 几毫秒
有一些牺牲吞量
垃圾收集器分类:
串行 Serial
并行 Parallel 更多关注吞吐量
并发 垃圾收集线程和业务代码线程会共同执行 CMS G1 ZGC 更加关注停顿时间
吞吐量和停顿时间 也是评判一个垃圾收集器的指标
throughput 一个给定的时间内完成的任务
responsiveness 停顿时间 响应的时间多快
垃圾收集器吞吐量等于
业务代码线程执行时间/(业务代码线程执行时间+垃圾收集线程执行时间)