【HotSpot、G1】垃圾回收算法和垃圾收集器

在这里插入图片描述

前言

上一篇我们说了如何判断一个对象是否存活,这一篇呢,就是接着前面几篇文章来的,我们知道堆中分为年轻代和老年代,有着不同的特点;每个区域有着不同的特点,也就有了多种垃圾回收算法,每种算法也是根据内存情况进行不同程度的优化

就像上一篇提到的打扫屋子,接下来就是需要找到打扫屋子的最合适的方法,比如屋子的哪些东西归为一类,哪些可以扔掉,哪些可以摆放到一起

在这里插入图片描述

JVM的算法有很多,大鱼这里只说比较常见的四种:

标记-清楚算法

复制算法

标记-整理算法

分代收集算法

说完了算法,就会介绍下JVM的流行的各种收集器,收集器就是垃圾回收算法的实现咯,就是理论和实现的关系,一起来学习吧

我知道你们都是最爱学习的仔,没错吧(暗示关注,因为大鱼会持续给大家更新技术博文

在这里插入图片描述

四种算法

四种算法分别是标记清除、复制、标记整理、分代收集四种算法

标记-清除算法

”标记-清楚“算法,顾名思义,就是分为标记和清楚两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象

这是属于最基础的垃圾回收算法,后续的多种算法都是基于它的改进

在这里插入图片描述

但是它有两个主要的缺点的嘞

一个是效率问题,就是标记和清楚的效率都比较低

二是空间问题,标记清楚之后会产生大量的内存碎片,空间碎片多了就会导致空间的利用率不高

你想啊,清楚之后出现很多比较小的空间,当程序在以后的运行过程中需要分配比较大的对象的时候,无法找到足够的连续空间时,便会提前触发另一次的GC动作

复制算法

为了解决效率问题,便出现了复制收集算法,它将可用的内存按照容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了的时候,就把活着的对象复制到另一块上,然后将已经使用过的内存空间全部清理掉

这样便使得每次都是对其中一块进行内存回收,内存分配时就不需要考虑内存碎片这样的复杂情况;

只需要移动堆顶指针,按照顺序分配内存即可,实现很简单,运行起来也比较高效;不过这种算法的代价是将内存缩小为原来的一半,持续复制生存期比较长的对象会导致效率降低

在这里插入图片描述

现在很多商业虚拟机都使用这种手机算法来回收新生代,新生代的98%对象都是朝生夕死的

所以呢,并不需要按照1:1的比例来划分内存空间,而是把内存分成一块较大的Eden区域和两块较小的Survivor空间

每次使用其中的Eden区域和一块Survivor区域,最后复制的时候将Eden和Survivor区域还存活的对象复制到另一块Survivor区域,最后清理掉Eden区域和Survivor区域,只剩下刚刚复制过的Survivor区域,继续使用Eden和这块Survivor区域

这样呢,每次也就只会浪费10%的内存,我们没有办法保证每次回收都只有不多于10%的对象存活&#x

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值