深入讲解JVM垃圾回收算法思想及全过程

垃圾回收算法

由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又
各不相同,因此只是深入讲解以下几种算法的思想。

  • 标记清除算法:先标记出需要回收的对象,再清除回收。是一种最基础的收集算法。标记和清除两个过程的并不高,另一个问题就是空间问题:清理完成后产生大量的不连续的内存碎片,以后分配大的对象的时候,无法找到足够的连续内存而不得不提前触发另一次的垃圾处理动作。
    * 回收前先标记出需要回收的对象(黑色方块)
    在这里插入图片描述
    在这里插入图片描述

    • 回收后有大量的非连续的碎片空间(图中白色方块为未使用的)
  • 复制算法:最开始阶段时,是将内存分为了相等的两块,只先使用内存的一半,那一半全部为空闲状态。当这一块内存使用完了,将还存活的对象直接复制到另一块未使用的内存上,而此内存上则全部清空。就吧不回收的放到另一边,然后全部清除了。内存分配时也就不用考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配内存即可,这种方法十分高效,但是空间代价太高,每次只使用内存的一半。
    在这里插入图片描述

现在的商业虚拟机都采用这种收集筧法来回收新生代,IBM公司的专门研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1 : 1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivore。当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。
HotSpot虚拟机默认Eden:和Survivor的大小比例是8: 1: 1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存会被“浪费”当然; 98%的对象可回收只是一般场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,
当Survivor空间不够用时,需要依赖其他内存(这里指老年代)进行分配担保( Handle Promotion).

在这里插入图片描述
注意:每次只使用一个Eden和一个Survivor,回收后复制到另外一个Survivor上!

  • 标记整理算法:
    • 如果对象存活率高时就要进行较多的复制操作,效率就会变低,更主要是不想浪费空间,就需要有额外的空间进行分配担保,为了应对内存中种所有对象都100%存活的极端情况,所以再老年代一般不能选用复制算法。
    • 标记整理算法时根据老年代的特点设计的。依然是先标记,但是后续的步骤时让所有的对象都向一端移动然后清理掉端表姐以外的内存。
    • 在这里插入图片描述

面对垃圾回收
标记整理算法移动对象的话,使用句柄访问定位对象就更加稳定,因为移动只需要修改实例数据指针,而对reference本身不需要修改。如果需要更快的速度则是直接指针访问。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值