jvm分代回收机制及垃圾回收算法

目录

GC:主要回收堆空间

分代回收理论

垃圾回收基础知识

复制算法:所有新生代使用

标记清除算法:老年代

标记整理算法:老年代

jvm常用垃圾回收器(1.8)

单线程垃圾回收器:暂停所有的用户线程,开启GC线程

多线程垃圾回收器:多个GC线程来回收

并发垃圾回收器:让业务线程和GC线程同时跑,减少了Stop the world时间


GC:主要回收堆空间

  1. Minor GC或者Young GC:回收新生代,大概三分之一的堆空间,Eden、From、To
  2. Major GC或者Old GC:回收老年代,大概三分之二的堆空间
  3. Full GC:回收新生代、老年代、方法区

分代回收理论

  1. 大部分对象都是朝生夕死(新生代)
  2. 熬过多次垃圾回收的对象就很难回收(老年代)

垃圾回收基础知识

复制算法:所有新生代使用

  1. 算法详情:将内存区域一分为二,当一半满了,扫描内存进行可达性分析,将存活对象复制到另外一半内存,原来内存格式化
  2. 特点:实现简单运行高效,没有内存碎片,会排序,会更新内存地址的引用
  3. Eden区来源
    1. 一般是Eden是8份,From一份,To一份,因为只有一小部分会长期存活,所以预留空间会只有20%左右
    2. Appel式回收:在Eden区分配,用完该区以后,其中一小部分长期存活,会复制到From区,Eden区格式化;继续生成对象放到Eden区,用完后继续复制存活对象到To区,如果此时From区对象还存活那么也放到To区,Eden区格式化,后续也是这种对象转换
      1. 提高空间利用率:从只浪费50%提升到浪费10%的预留空间
      2. 空间分配担保

标记清除算法:老年代

  1. 算法详情:第一遍扫描可达性分析算法不可达的做标记,第二遍扫描将有标记的对象回收
  2. 特点:位置不连续产生碎片,因为回收以后没法变成连续的内存空间,所有有些对象无法利用这些内存;效率低需要两边扫描

标记整理算法:老年代

  1. 算法详情:和标记清除不一样是第二遍先把内存空间移动成连续的空间,调整对象引用指针,再将剩余空间格式化
  2. 特点:没有内存碎片,效率比标记清除更低

jvm常用垃圾回收器(1.8)

单线程垃圾回收器:暂停所有的用户线程,开启GC线程

  1. Serial:回收新生代,复制算法
  2. Serial Old:回收老年代,标记整理算法

多线程垃圾回收器:多个GC线程来回收

  1. Parallel Scavenge:1.8默认垃圾回收器,复制算法
  2. Paralle Old:默认垃圾回收器,标记整理算法

并发垃圾回收器:让业务线程和GC线程同时跑,减少了Stop the world时间

  1. CMS:单纯回收老年代,标记清除算法,和ParNew配合回收新生代,关键在于把GC时间长的操作和用户线程同时运行减少用户线程暂停时间,不使用标记整理算法的原因就是在并发清除时如果再整理内存会改变存活对象地址用户线程受影响
    1. 初始标记:仅标记GC roots可达的第一层对象,因为标记速度快所以暂停所有用户线程时间比较短
    2. 并发标记:对整个叶子GC roots可达对象标记,因为数量多,此时用户线程和GC线程同时运行,但是会出现新生成的垃圾未标记情况
    3. 重新标记:重新标记并发标记完成时候新生成垃圾,此时会暂停所有用户线程,但是时间比较短
    4. 并发清除:用户线程和GC线程同时运行,清理垃圾,清理完成GC线程重置为用户线程
    5. CMS问题:cpu需求比较大;在并发清理时候用户线程还在运行,会产生浮动垃圾,只能下次垃圾回收流程才能清理;如果空间不够放置浮动垃圾,会切换到Serial Old回收器;有内存碎片,算法导致不能有连续内存,可以用UserCMSCompactAtFullCollection参数,意思是如果进行FullGc要进行内存整理,但是此时会用Serial Old垃圾回收器
  2. G1:尽可能达到设置的停顿时间,建议堆空间约6GB对或者更大且GC有延时要求(稳定且可预测的暂停时间小于0.5秒)选择
    1. 内存划分:将堆空间按region划分,每一块大小为2的次幂,每个region扮演一个分代空间,例如Eden、Old、Survivor和解决大对象的区域,一般对象大于每个区域的一半就会放到大对象区域,有多少大小就占连续的多少空间
    2. 筛选回收:目的做可预测停顿,如果设置最大停顿时间,那么垃圾回收器会选择哪些符合去回收,因为是选符合回收价值的垃圾,所以增加效率
    3. 初始标记:用户线程暂停,标记GC roots直接关联对象
    4. 并发标记:标记可达对象;在此时新分配对象(不是垃圾),会出现漏标问题。在并发标记开始在每个Region(根据需要扮演Eden、Old、From、To这些分代,大小自动也可以设置)划一块内存区域,放置并发标记过程中新分配对象的指针指向;会生成一个对象的快照,后续对比哪些对象漏标记
    5. 最终标记:停止用户线程,对比对象快照,对漏标垃圾进行标记
    6. 筛选回收:继续停止用户线程,筛选出回收哪些垃圾暂停时间最低或者效率最高,然后进行回收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值