jvm-垃圾回收算法和垃圾回收器(6)

垃圾回收算法:

  1. 分代收集理论
  2. 标记-复制算法
  3. 标记-清除算法
  4. 标记-整理算法

分代收集理论:

java将堆分为年轻代和老年代,我们可以根据给个代的特点选择合适的垃圾收集酸饭

标记-复制算法 :

把内存分为两块,每次只用一块,当这一块使用完后,将活着的对象移动到另一块中,再把之前的清理掉

标记-清除算法:

  标记存活的对象,统一回收未标记的对象( 也可以反之)

标记-整理算法: 

 标记存活的对象,统一回收未标记的对象,并且清理后整理内存,把存活的对象整理一块,空余的整理一块

 

 

 

 

垃圾收集器:

  1. Serial
  2. Parallel Scavenge
  3. ParNew
  4. CMS
  5. G1

Serial:单线程收集器,只有一条垃圾手机线程去完成垃圾回收工作,垃圾收集工作时 必须STW(停止用户线程)

 

Parallel Scavenge:是Serial多线程版本   (新生代复制算法,老年代整理算法)

 

ParNew:和Parallel Scavenge收集器  相似都是多线程收集,主要是和CMS收集器配合使用 

CMS:实现垃圾回收和用户线程同时工作    优点:并发收集,低停顿

  1. 初始标记:暂停所有的用户线程,并记录gc  roots 直接能引用的对象
  2. 并发标记:用户线程会执行,同时从gc  roots集合中的初始对象开始,遍历寻找引用的对象,存放到root集合中。(在标记过程中,有的被标记的对象可能会变成垃圾对象)
  3. 重新标记:暂停所有线程,修成并发标记期间,变动的对象(被标记,并且现在成为垃圾对象)
  4. 并发清理:用户线程会执行,同时GC线程开始对未标记的区域做清扫。(如果这个阶段有新的对象新增,则不对对给对象进行任何处理)
  5. 并发重置:重置,本次GC过程中的标记数据。

浮动垃圾:并发标记和并发处理阶段又产生垃圾,这种浮动垃圾只能等到下一次GC

如果垃圾还没回收完,再次触发full  GC,此时就会用serial垃圾回收器 回收

 

G1:(复制算法)

1:G1将对象划分为多个大小相等独立区域,jvm:最多有2048个 Region(例:堆大小4096,则每个区域有2M)

2:每个区域块可能会变动, 之前是年轻代,可能变成老年代。并不是特定的

3 :大对象有自己的区域存储,叫做Humongous, 大对象的判定一般是,如果一个对象超过Region的50%,,就会存放在Humongous。  如果大对象特别大可以横跨多个Region

4:可以设定本次垃圾回收,需要多少时间

5:年轻代默认会分配内存的5%,可设定年轻代的占比。在系统运行中会给年轻代增加更多的区域块。最多不超过60%

 

 

  1. 初始标记:同CMS
  2. 并发标记:同CMS并发标记
  3. 最终标记:同CMS重新标记
  4. 筛选回收:每个区域块,会记录回收价值和成本进行排序。如果设定GC回收时间,那么只会在设定时间内 收集垃圾,多余的垃圾下次gc回收

  1. Yong GC:eden区域放满并不是 马上触发,先判断eden区回收需要多少时间,如果远远小于时间,则会增加eden区域。等下次eden区域满时,计算是否和设定的GC停顿时间相近。相近则回收
  2. Mixed GC
  3. Full GC

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值