分代GC算法解读,垃圾回收器

为什么分代GC算法要分区?


1.大多数对象都可以被直接回收
2.新生代默认远小于老年代
3.SpringBoot中的许多对象会存放入old区

1.可以调整两者比例适用不同场景
2.可以选择不同的垃圾回收算法,老年代一般选择标记清除算法或标记整理算法
3.分代设计允许只回收Young区,可以有效见效stw


垃圾回收器分为三类
young区:Serial,ParNew,Parallel Scavenge
old区:Serial Old,CMC,Parallel Old
单独的 :G1
除了G1其他的需要搭配使用(上下一一对应)其他搭配关系在jdk14后都已废弃,jdk14还废弃了CMS。
Serial是一种单线程串行回收年轻代的垃圾回收器,单cpu下吞吐量优秀,适用于java编写的客户端(使用复制算法)
Serial Old是一种单线程串行回收old区,单cpu下吞吐量优秀,

ParNew本质上是对Serial的多线程优化回收年轻代,使用复制算法,多cpu停顿时间较短,吞吐量和停顿时间都不如G1
CMS回收老年代,使用标记清除算法
Parallel Scavenge回收年轻代,是jdk8默认回收器,使用复制算法,会自动调整堆大小,不能保证单词停顿时间
Parallel Old 是为Parallel Scavenge设计的老年代回收器
jdk9之后强烈建议使用G1
G1优点
1.支持巨大的堆空间回收,具有较高的吞吐量
2.支持多CPU并行垃圾回收
3.允许用户设置最大暂停时间
G1内存结构
G1将堆划分为多个等大的区域称为Region,不要求连续,分为Eden,Survivor,Old
G1垃圾回收
年轻回收:回收Eden和Survivor,会出现STW
执行流程:
1.创建新对象会存放入Eden区,当判断空间不足时,无法分配对象会启动young gc
2.标记Eden和Survivor区存活的对象
3.根据最大暂停时间选择将某些区域对象复制到一个新的Survivor区(年龄加一),清空这些区域
4.当年龄到了15会放入Old区
5.当大小超过Region一半会直接放入老年代,称为Humongous区
堆占有率超过阈值出发混合回收(MixedGC)回收所有区域
过程:
1.初始标记:GC Roots关联对象(多线程)
2.并发标记:标记对象引用的对象标记为存活
3.最终标记:标记一些引用改变漏标的对象
4.并发复制清理:使用复制算法,优先清理存活度低的区域

当清理过程发现没有足够的Region存放转移的对象,会出现Full GC(单线程执行标记算法,清理整个堆),会导致用户进程暂停 

使用标记整理算法

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值