通俗理解JVM系列(三)——GC算法理解


系列导航

(一) 虚拟机结构
(二) 类加载机制
(三) GC算法理解
(四) 垃圾收集器及其选择
(五) GC调优



一.垃圾对象判断

判断对象是否可回收

引用计数法

概念:这种方式现在用的不多,它给对象添加一个引用计数器,每当有一个地方引用了此对象,计数器就加1,当引用失效则减1。任何时候,计数器为0时,表示对象不再被引用。

特点:这个方式效率高,但是无法解决相互引用的问题,当对象两个对象相互引用对方,导致循环引用,这样计数器就无法为0,所以无法进行回收。


可达性分析算法

通过一系列称为GC Roots的对象作为起点,从这些节点向下搜索,节点走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连,则证明此对象不可用。

GC Roots根节点:类加载器、Thread、JVM栈内的本地变量表、static成员、常量引用、本地方法栈的变量等。

在这里插入图片描述


判断常量是否废弃

假如在常量池中存在一个字符串,当前没有任何String对象引用这个字符串常量,那就说明这个常量池中的字符串为废弃常量,在回收时将会被清理。


二.垃圾回收算法

在这里插入图片描述

标记-清除算法

在这里插入图片描述

概念:该算法分为两个阶段:标记和清除。首先标记出所有需要清理的对象,然后统一回收所有被标记的对象。

特点

  • 效率:标记和清除两个过程效率都不高
  • 空间:标记和清除后会产生大量不连续碎片,可能导致不够分配内存,还可能需要产生GC

复制算法

在这里插入图片描述

概念:把内存分为大小相同的两块,每次只使用其中一块。当其中一块使用完后,就把还存活的对象复制到另一块,然后把再把使用空间清理掉。这样

特点

  • 每次回收都是对内存区间的一半进行回收
  • 只有一半的内存区域,可能不能存放特别大的对象

应用

最好的应用,就是在Survivor的两块区域(From 、To)轮询


标记-整理算法

在这里插入图片描述

概念:和标记-清除对照,此算法也是对可回收对象进行标记,但是在清除后,会让所有的存活对象向一端进行移动,然后清理掉边界外内存

特点

  • 解决了内存碎片的问题
  • 标记和整理的效率都不高

分代收集算法

概念:现在基本上都是采用这种算法;该算法根据对象存活周期的不同将内存分为几块(新生代、老年代),根据各个年代的特点选择合适的收集算法。

新生代:每次都有大量对象回收,选择复制算法。

老年代:对象存活几率比较高,所以选择标记算法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值