Java虚拟机二、垃圾回收与内存分配(2)垃圾回收算法(待补充)

1. 标记清除算法

1. 思路

在这里插入图片描述

2. 优缺点
  • 优点
  1. 基于最基础的可达性分析算法,是最基础的收集算法;而后续的收集算法都是基于这种思路并对其不足进行改进得到的;
  • 缺点
  1. 效率问题
    标记和清除两个过程的效率都不高;

  2. 空间问题
    标记清除后会产生大量不连续的内存碎片;这会导致分配大内存对象时,无法找到足够的连续内存;从而需要提前触发另一次垃圾收集动作;

3. 应用

主要用于老年代的CMS收集器

2. 复制算法

主要是为了解决标记清除算法的效率问题

1. 思路
  1. 把内存划分为大小相等的两块,每次只使用其中一块;

  2. 当一块内存用完了,就将还存活的对象复制到另一块上(而后使用这一块);

  3. 再把已使用过的那块内存空间一次清理掉,而后重复步骤2;
    在这里插入图片描述

2. 优缺点
  • 优点
  1. 每次都是只对整个半区进行内存回收;
  2. 内存分配时也不用考虑内存碎片等问题(可使用"指针碰撞"的方式分配内存);
  3. 实现简单,运行高效;
  • 缺点
  1. 空间浪费

    可用内存缩减为原来的一半,太过浪费(解决:可以改良,不按1:1比例划分);

  2. 效率随对象存活率升高而变低

    当对象存活率较高时,需要进行较多复制操作,效率将会变低(解决:后面的标记-整理算法);

3. 应用

现在商业JVM都采用这种算法(通过改良缺点1)来回收新生代;
如Serial收集器、ParNew收集器、Parallel Scavenge收集器、、G1(从局部看);

4. 改良(HotPot虚拟机)
  • 介绍:弱代理论
    分代垃圾收集基于弱代理论(weak generational hypothesis),具体描述如下:
    1. 大多数分配了内存的对象并不会存活太长时间,在处于年轻代时就会死掉;
    2. 很少有对象会从老年代变成年轻代;
    其中IBM研究表明:新生代中98%的对象都是"朝生夕死";
    所以并不需要按1:1比例来划分内存(解决了缺点1);

  • HotPot虚拟机中的新生代内存布局及其算法
    1. 新生代内存分为一块较大的Eden空间两块较小的Survivor空间
    2. 每次使用Eden和其中一块Survivor;
    3. 当回收时,将Eden和使用中的Survivor中还存活的对象一次性复制到另外一块Survivor;
    4. 而后清理掉Eden和使用过的Survivor空间;
    5. 后面就使用Eden和复制到的那一块Survivor空间,重复步骤3;
    默认Eden:Survivor=8:1,即每次可以使用90%的空间,只有一块Survivor的空间被浪费;(8 + 1 + 1)

  • 分配担保
    如果另一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制(Handle Promotion)进入老年代;
    分配担保在以后讲解垃圾收集器执行规则时再详解;

3. 标记整理算法

此算法根据老年代的特点提出

思路:
  1. 标记

    标记过程与"标记-清除"算法一样;

  2. 整理
    但后续不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动
    然后直接清理掉端边界以外的内存;
    在这里插入图片描述

优缺点
  • 优点
    1. 不会像复制算法,效率随对象存活率升高而变低
    由于老年代具有对象存活率高,没有额外的空间可以分配担保的特点;
    所以老年代一般不能直接选用复制算法算法;而选用标记-整理算法;
    2. 不会像标记-清除算法,产生内存碎片
    因为清除前,进行了整理,存活对象都集中到空间一侧;
  • 缺点
    主要是效率问题:除像标记-清除算法的标记过程外,还多了需要整理的过程,效率更低;
应用场景

很多垃圾收集器采用这种算法来回收老年代;
如Serial Old收集器、G1(从整体看);

分代收集算法

“分代收集”(Generational Collection)算法结合不同的收集算法处理不同区域。

算法思路

基于前面说的弱代理论,其实并没有什么新的思想;
只是根据对象存活周期的不同将内存划分为几块;
这样就可以根据各个年代的特点采用最适当的收集算法;
一般把Java堆分为新生代老年代

  • 新生代
    每次垃圾收集都有大批对象死去,只有少量存活;
    所以可采用复制算法

  • 老年代
    对象存活率高,没有额外的空间可以分配担保;
    使用**“标记-清理""标记-整理”**算法;
    结合上面对新生代的内存划分介绍和上篇文章对Java堆的介绍,可以得出HotSpot虚拟机一般的年代内存划分,如下图:
    在这里插入图片描述

优缺点
  • 优点
    可以根据各个年代的特点采用最适当的收集算法;

  • 缺点
    仍然不能控制每次垃圾收集的时间;

应用场景

目前几乎所有商业虚拟机的垃圾收集器都采用分代收集算法;
如HotSpot虚拟机中全部垃圾收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1(也保留);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值