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(单线程执行标记算法,清理整个堆),会导致用户进程暂停?
使用标记整理算法