jvm的垃圾回收机制

在进行回收前就要判断哪些对象还存活,哪些已经死去。下面介绍两个基础的计算方法:

  • 引用计数器计算:这个方法较为简单。就是在一个对象被引用时计数器加一,引用失效时计数器减一,计数器等于0时就是不会再次使用的。不过这个方法有缺陷,有一种情况就是出现对象的循环引用时GC没法回收。
  • 可达性分析计算:这是一种类似于二叉树的实现,将一系列的GC ROOTS作为起始的存活对象集,从这个节点往下搜索,搜索所走过的路径成为引用链,把能被该集合引用到的对象加入到集合中。搜索当一个对象到GC Roots没有使用任何引用链时,则说明该对象是不可用的。主流的商用程序语言,例如Java,C#等都是靠这招去判定对象是否存活的。如下图所示:
    在这里插入图片描述
    在Java中,可作为GC Roots对象的列表:
    • Java虚拟机栈中的引用对象。
    • 本地方法栈中JNI(既一般说的Native方法)引用的对象。
    • 方法区中类静态常量的引用对象。
    • 方法区中常量的引用对象。

经过计算判断某个对象需要被干掉之后。jvm通过垃圾回收算法来回收对象多占用的空间。常用的垃圾回收算法有标记清除,复制,标记整理和分代收集算法。

  1. 标记清除算法:
    该算法分“标记”和“清除”两个阶段。先标记出要回收的所有对象,标记结束后统一回收。其实它就是把已死亡的对象标记为空闲内存,然后记录在一个空闲列表中,当我们需要new一个对象时,内存管理模块会从空闲列表中寻找空闲的内存来分给新的对象。这个算法虽然简单,但是会造成内存碎片化,就是回收的对象空间不连续。造成下一次需要插入一个内存占用较高的对象时插入不进去的问题。
    在这里插入图片描述

  2. 复制算法
    为了解决标清楚算法所带来的的内存碎片化的问题。我们可以将内存分为A,B两部分。每次只使用其中的一个,例如A。当A内存不足的时时候,把A中的回收之后的内容复制到B中,然后在交换指针。这就是复制算法。但是复制算法会造成内存缩水。
    在这里插入图片描述

  3. 标记整理算法
    复制算法在对象存活率高的时候会有一定的效率问题,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。
    在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值