垃圾回收算法与垃圾收集器

1.对象是否死亡

Java堆中存放了几乎所有的对象实例,垃圾回收器在对对象进行回收时,首先要判断哪些对象是存活的,哪些对象是死亡的,主要有以下两种方法

1.1引用计数法

给对象增加一个引用计数器,每当有一个地方引用它时,计数器就要加1,对象的引用被解除时,引用就减1;当计数器的值为0,对象就会被回收掉。
代码示例:

public class Demo03 {
    public static void main(String[] args) {
        String s1 = new String("a"); //在堆上创建对象a,引用器为1
        String s2 = new String("b"); //在堆上创建对象b,引用器为1
        s2 = s1;  //对象a的引用器为2,对象b的引用器为0
        s1 = null; //对象a的引用器为1
        s2 = null; //对象a的引用器为0
    }
}

图解
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2引用计数法的优缺点

优点:
实现简单,效率高
缺点:
可能会出现循环引用的情况,引用计数都不为0,最终导致对象无法被回收掉

1.2可达性分析算法

此算法的核心思想为:通过一系列的GC Roots的对象作为起始点,从这些结点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何的引用链相连时,证明该对象是不可用的。
在这里插入图片描述
在Java语言中,可以作为GCroots的对象包含下面几种:
(1)虚拟栈中引用的对象
我们知道,每个方法执行的时候,JVM都会创建一个相应的栈帧,栈帧包括(操作数栈,局部变量表,运行时常量池的引用),一旦该方法执行结束之后,该栈帧就会从虚拟栈中弹出,这样一来布局对象的引用就不存在了,这些对象在下一次GC时就会被回收掉
(2)方法区中静态属性引用的对象(一般是指被static修饰的对象)
private static User user = new User();
(3)方法区常量引用的对象
private final User user = new User();
(4)本地方法栈中引用的对象

2.垃圾回收算法

2.1标记清除算法

“标记-清除”算法分为“标记”和“清除”两个阶段,首先需要标记要回收的对象,在标记完成之后统一回收所有被标记的对象。
缺点:
(1)效率问题:标记和清除这两个过程的效率都不高
(2)空间问题:标记清除之后会产生大量的内存碎片,空间碎片太多可能会导致以后在程序运行中需要分配较大对象时,无法找到足够连续内存而不得不提前触发另一次垃圾回收。
在这里插入图片描述

2.2复制算法(新生代回收算法)

"复制"算法是为了解决"标记-清理"的效率问题。它将可用内存按容量划分为大小相等的两块,每次只使
用其中的一块。当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后
再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配
时也就不需要考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配即可。此算法实现简单,运
行高效。算法的执行流程如下图 :
在这里插入图片描述
(1)新生代中98%的对象都是朝生夕死的,将内存划分为一块较大的Eden区和两块较小的Survivor区。当回收时,将Eden和Survivor中还存活的对象一次性复制到另一块Survivor空间,然后清理掉之前的区域。
(2)HotSpot默认Eden与Survivor的大小比例是8 : 1,也就是说Eden:Survivor From : Survivor To = 8:1:1。所以每次新生代可用内存空间为整个新生代容量的90%,而剩下的10%用来存放回收后存活的对象
复制算法的一个执行流程:
在这里插入图片描述
在这里插入图片描述

2.3标记整理算法(老年代回收算法)

复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用
复制算法。
针对老年代的特点,提出了一种称之为"标记-整理算法"。标记过程仍与"标记-清除"过程一致,但后续步
骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的
内存。流程图如下:
在这里插入图片描述
分代收集:
在这里插入图片描述

3.垃圾收集器

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值