JVM中垃圾回收算法

比较各个算法的优缺点

在这里插入图片描述
综上所述:从表格中我们可以看出,复制算法效率最高,也不存在内存碎片化,但有空间浪费的现象,一般用来处理新生代中的对象 而标记-清除算法和标记压缩算法则主要处理老年代中对象内存分配比较大的,并且时效性不如新生代的

标记-清除算法

标记-清除算法由标记阶段清除阶段构成。
标记阶段是把所有活着的对象都做上标记的阶段;
清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。
通过这两个阶段,就可以令不能利用的内存空间重新得到利用。从标记-清除算法我们可以看出,该算法不涉及对象移动,但是可能会产生内存碎片化问题。空间碎片太高可能会导致程序运行时需要分配较大内存时候,无法找到足够的连续内存,需要其他垃圾回收帮助回收内存。

复制算法

复制算法内存空间分为两块区域:From、to,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。上面那种复制算法有一半的空间是浪费的。所以在Java新生代把内存区域分为Eden空间、from、to空间3个部分,from和to空间也称为survivor 空间,用于存放未被回收的对象。对象开始都是Eden生成;当回收时,将Eden和from中存活的对象移动到to区域中。复制算法存在空间浪费的情况,始终都要保持一个Survivor是空闲的,并且在GC的时候要是存活对象大小超过了Survivor中的大小,就需要另外的策略存储存活对象。目前open JDK新生代回收策略就是采用的复制算法,其中Eden和Survivor的默认配置为8:1

标记-压缩算法

标记-压缩算法由标记阶段压缩阶段构成。
标记阶段标记-清除算法中的标记阶段完全一样,
压缩阶段是让所有存活的对象向一端移动。
这样空闲内存都在另外一端,属于连续空间,不存在内存碎片化问题,但是会产生对象移动。

分代算法

根据对象的不同生命周期分别管理, JVM 中将对象分为我们熟悉的新生代老年代永久代分别管理。这样做的好处就是可以根据不同类型对象进行不同策略的管理,例如新生代中对象更新速度快,就会使用效率较高的复制算法。老年代中内存空间相对分配较大,而且时效性不如新生代强,就会常常使用Mark-Sweep-Compact (标记-清除-压缩)算法。分代算法的流程如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值