JVM垃圾回收算法

java虚拟机垃圾回收算法

java虚拟机垃圾回收算法,没你想象中那么难。


前言

Java作为全世界最主流的开发语言之一,小伙伴们一定不陌生。之所以受到这么多人的青睐不仅仅是因为它天生跨平台的特性,还有它的垃圾自动回收机制也让人感到不可思议。垃圾自动回收机制看起来似乎那么完美,然面对高并发,高吞吐量由于频繁的GC给用户体验带来很大的挑战,这时人为优化就尤为重要,想做好GC的优化工作,知其原理已成必然。本文博主将和读者一起走进这神秘的世界。

目标

希望阅读本文能帮助读者解决以下几个问题:

  1. Java虚拟机如何判定一个对象为垃圾?
  2. Java虚拟机的垃圾回收算法有哪些?
  3. 不同的垃圾回收算法的优缺点以及应用场景

判定垃圾对象算法

Java虚拟机中,在垃圾回收之前,知道哪些数据是垃圾至关重要。在Java虚拟机规范中通过引用计数算法和可达性分析算法两种方式来确认对象是否为垃圾。

引用计数算法

给每一个对象都添加一个引用计数器,当有一个地方引用时,引用计数器加一,取消引用时引用计数器减一。引用计数器的值为零时判定为对象已死。

优点

  • 原理简单
  • 效率高

缺点

  • 正常工作需要配合额外的处理
  • 很难处理对象循环引用问题

可达性分析算法

定义了根对象(GC Root),从根对象的引用关系往下找,将所有关联的引用对象(采用递归查找)称为存活对象,反之将无法找到和根对象引用关系的对象称为死亡对象(垃圾对象)。

根对象(GC Root)

  • Java虚拟机栈(栈帧中的本地变量表)中引用的对象 (正在压栈的方法的所有变量)
  • 方法区中的静态属性引用 (静态变量)
  • 方法区中常量属性引用
  • 本地方法区 Native 方法的引用
  • Java虚拟机内部引用的对象,如异常对象、基本数据类型的封装类和类加载器类等等
  • 被同步锁持有的对象(synchronized 关键字)

优点

  • 功能强大
  • 能处理对象循环依赖问题

缺点

  • 计算复杂,GC Root 在不同的内存区域定义不一致,为了避免根对象的膨胀,需要做不同的优化手段

虽然弊端很明显,但是这种算法能解决不同场景下的对象标记,则当前主流的Java虚拟机厂商几乎都选择这种算法

垃圾回收算法

根据上文我们知道如何判定一个对象为垃圾,本章我们讨论面对不同内存区域的垃圾,该采用怎么样的算法回收。java虚拟机常用算法有:标记-清楚,标记-复制和标记-整理3种,下面详细讨论。

标记-清除算法

原理

第一步: 根据可达性分析算法或引用计数法将存活的对象标记
在这里插入图片描述
第二步:全内存区域扫描将未存活的对象或数组清除且用空闲表(free-list)记录已清除的内存地址。

在这里插入图片描述

优点

  • 不需要额外内存空间

缺点

  • 两次扫描,且有一次全表扫描,耗时长
  • 内存碎片化(垃圾在内存中地址不连续导致)
  • 用空闲表(free-list)管理内存,新对象分配内存时增加复杂度

标记-复制算法

原理

** 根据可达性分析算法或引用计数法将存活对象复制到另一个内存区域,存活对象全部复制完成后清空当前内存区域**
在这里插入图片描述

优点

  • 没有标记和清除过程,效率高
  • 内存规整(可采用指针碰撞方式分配内存,性能高)

缺点

  • 需要双倍的内存空间
  • 存活对象远远大于死亡对象时,耗时

标记-整理算法

原理

第一步: 根据可达性分析算法或引用计数法将存活的对象标记
在这里插入图片描述
第二步:全内存区域扫描将存活的对象移动到内存一端,然后将另一端的垃圾对象全部清除
在这里插入图片描述

优点

  • 内存规整(可采用指针碰撞方式分配内存,性能高)

缺点

  • 移动对象需要花费很大的资源(耗时,耗力)


总结

每一种垃圾回收算法都有利弊,不同的场景他们各自发挥自己的优点。如果一个内存区域死亡对象远远大于存活对象时标记-复制算法将是一个不错的解决方案。根据上文读者不难发现标记-清除算法和标记-整理算法,逻辑上相差不大,只是区别于垃圾回收后内存是否规整问题。在相同条件下单次垃圾回收标记-清除算法和比标记-整理算法更快,但是标记-清除算法随着清除次数的增加导致的内存碎片化越来越严重,从而总GC时长标记-整理算法更胜一筹。 实时上目前大部分的虚拟机在堆的新生代内存区域都采用了标记-复制算法,老年代采用标记-清除算法或标记-整理算法。在HotSpot虚拟机中,Serial,ParNew都采用标记-复制算法,CMS(关注GC停顿时间)采用了标记-清除算法,Parallel Scavenge (关注程序吞吐量)采用标记-整理算法就证明了这一点。

原创不易,转载请标明来源

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗德阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值