垃圾回收算法:
- 分代收集理论
- 标记-复制算法
- 标记-清除算法
- 标记-整理算法
分代收集理论:
java将堆分为年轻代和老年代,我们可以根据给个代的特点选择合适的垃圾收集酸饭
标记-复制算法 :
把内存分为两块,每次只用一块,当这一块使用完后,将活着的对象移动到另一块中,再把之前的清理掉
标记-清除算法:
标记存活的对象,统一回收未标记的对象( 也可以反之)
标记-整理算法:
标记存活的对象,统一回收未标记的对象,并且清理后整理内存,把存活的对象整理一块,空余的整理一块
垃圾收集器:
- Serial
- Parallel Scavenge
- ParNew
- CMS
- G1
Serial:单线程收集器,只有一条垃圾手机线程去完成垃圾回收工作,垃圾收集工作时 必须STW(停止用户线程)
Parallel Scavenge:是Serial多线程版本 (新生代复制算法,老年代整理算法)
ParNew:和Parallel Scavenge收集器 相似都是多线程收集,主要是和CMS收集器配合使用
CMS:实现垃圾回收和用户线程同时工作 优点:并发收集,低停顿
- 初始标记:暂停所有的用户线程,并记录gc roots 直接能引用的对象
- 并发标记:用户线程会执行,同时从gc roots集合中的初始对象开始,遍历寻找引用的对象,存放到root集合中。(在标记过程中,有的被标记的对象可能会变成垃圾对象)
- 重新标记:暂停所有线程,修成并发标记期间,变动的对象(被标记,并且现在成为垃圾对象)
- 并发清理:用户线程会执行,同时GC线程开始对未标记的区域做清扫。(如果这个阶段有新的对象新增,则不对对给对象进行任何处理)
- 并发重置:重置,本次GC过程中的标记数据。
浮动垃圾:并发标记和并发处理阶段又产生垃圾,这种浮动垃圾只能等到下一次GC
如果垃圾还没回收完,再次触发full GC,此时就会用serial垃圾回收器 回收
G1:(复制算法)
1:G1将对象划分为多个大小相等独立区域,jvm:最多有2048个 Region(例:堆大小4096,则每个区域有2M)
2:每个区域块可能会变动, 之前是年轻代,可能变成老年代。并不是特定的
3 :大对象有自己的区域存储,叫做Humongous, 大对象的判定一般是,如果一个对象超过Region的50%,,就会存放在Humongous。 如果大对象特别大可以横跨多个Region
4:可以设定本次垃圾回收,需要多少时间
5:年轻代默认会分配内存的5%,可设定年轻代的占比。在系统运行中会给年轻代增加更多的区域块。最多不超过60%
- 初始标记:同CMS
- 并发标记:同CMS并发标记
- 最终标记:同CMS重新标记
- 筛选回收:每个区域块,会记录回收价值和成本进行排序。如果设定GC回收时间,那么只会在设定时间内 收集垃圾,多余的垃圾下次gc回收
- Yong GC:eden区域放满并不是 马上触发,先判断eden区回收需要多少时间,如果远远小于时间,则会增加eden区域。等下次eden区域满时,计算是否和设定的GC停顿时间相近。相近则回收
- Mixed GC
- Full GC