介绍

程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。关于 JVMGC 算法主要有下面四种:

引用计数算法(Reference counting)

算法思想:

每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。

核心思想:

为每个对象额外存储一个计数器 RC ,根据 RC 的值来判断对象是否死亡,从而判断是否执行 GC 操作。

优点:

  • 简单
  • 计算代价分散
  • “幽灵时间”短(幽灵时间指对象死亡到回收的这段时间,处于幽灵状态)

缺点:

  • 不全面(容易漏掉循环引用的对象)
  • 并发支持较弱
  • 占用额外内存空间

例子如图:

初始状态:

改变引用后:

标记–清除算法(Mark-Sweep)

算法思想:

为每个对象存储一个标记位,记录对象的状态(活着或是死亡)。分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。

优点

  • 最大的优点是,相比于引用计数法,标记—清除算法中每个活着的对象的引用只需要找到一个即可,找到一个就可以判断它为活的。

  • 此外,这个算法相比于引用计数法更全面,在指针操作上也没有太多的花销。更重要的是,这个算法并不移动对象的位置(后面俩算法涉及到移动位置的问题)。

缺点

  • 很长的幽灵时间,判断对象已经死亡,消耗了很多时间,这样从对象死亡到对象被回收之间的时间过长。

  • 每个活着的对象都要在标记阶段遍历一遍;所有对象都要在清除阶段扫描一遍,因此算法复杂度较高。

  • 没有移动对象,导致可能出现很多碎片空间无法利用的情况。

例子如图

这个图中,圆圈内灰色的对象就是已经死亡的对象,被标记为死亡,等待清除。

标记–整理算法

算法思想

标记-整理法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。

优点

  • 该算法不会像标记-清除算法那样产生大量的碎片空间。

缺点

  • 如果存活的对象过多,整理阶段将会执行较多复制操作,导致算法效率降低。

例子

如图:

上面是标记阶段,下面是整理之后的状态。可以看到,该算法不会产生大量碎片内存空间。

复制算法

算法思想

该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。

注意:
这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。

优点

  • 实现简单
  • 不产生内存碎片

缺点

  • 每次运行,总有一半内存是空的,导致可使用的内存空间只有原来的一半。

总结

不同算法有不同的优点和缺点,除了引用计数法不常用外,其他三种算法在现在的java虚拟机上也是很常见的,间接说明了这几个经典算法还是有其适用性的。

理解 JVMGC 算法能够帮助我们更好地理解java的垃圾回收机制,例如,在 JVM 的年轻代使用的是复制算法来进行垃圾回收(由于其中的存活对象比例较小);而在老年代,使用的却是标记-清除法或标记-整理法(由于每次回收都只回收少量对象)

JVM的四种GC算法相关推荐

  1. 【JVM】四种GC算法(分代收集+三种标记算法)

    目录 参考文章 四种GC算法 分代收集算法(理论) 标记清除算法 标记整理算法 标记复制算法 三种算法的优缺点 参考文章 JVM的4种垃圾回收算法.垃圾回收机制与总结_我是guyue,guyue就是我 ...

  2. JVM之垃圾收集机制四种GC算法详解

    JVM之四种GC算法详解 目录: 什么是GC? GC算法之引用计数法 GC算法之复制算法(Copying) GC算法之标记清除(Mark-Sweep) GC算法之标记压缩(Mark-Compact) ...

  3. JVM(三)GC垃圾回收以及四种GC算法

    JVM(三) 学习视频链接,以示尊重:https://www.bilibili.com/video/BV1iJ411d7jS?p=4 图片来源:https://blog.csdn.net/weixin ...

  4. JVM常见4种GC算法

    JVM常见GC算法 1.标记-清除算法(Mark-Sweep) 2.标记-整理(压缩)算法(Mark-Compact) 3.复制算法(Copying) 4.分代收集(Generational Coll ...

  5. JVM的四种引用:强,软,弱,虚(与gc有关)

    JVM的四种引用 强 软 弱 虚 强 gc时不回收 软 软引用对象在gc时,在内存溢出前,会回收; 弱 弱引用对象在gc时,不论内存使用情况都会回收; 虚 虚引用对象在gc后,会发送一条通知给 Ref ...

  6. 深入JVM虚拟机(四) Java GC收集器

    转载自  深入JVM虚拟机(四) Java GC收集器 1 GC收集器 1.1 Serial串行收集器 串行收集器主要有两个特点:第一,它仅仅使用单线程进行垃圾回收:第二,它独占式的垃圾回收. 在串行 ...

  7. php主要算法设计,四种排序算法设计(PHP)

    标签 详细分析 /** * 四种排序算法设计(PHP) * * 1) 插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当 ...

  8. php四种基础算法:冒泡,选择,插入和快速排序法

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...

  9. 性能优化专题 - JVM 性能优化 - 04 - GC算法与调优

    目录导航 前言 Garbage Collect(垃圾回收) 如何确定一个对象是垃圾? 引用计数法 可达性分析 垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Ma ...

最新文章

  1. 算法笔记-链相关、链的基础、单链双链环链、链的各种功能实现、链的算法题、面试题以及算法优化方法(多)、C#
  2. linux驱动 打印变量,linux驱动 内核函数 变量 宏定义
  3. struts2教程--标签库详解
  4. C++学习之路 | PTA乙级——1090 危险品装箱 (25 分)(精简)
  5. python 发邮件 timeout_Python邮件发送/带附件发送
  6. [HTTP] HTTP的缓存机制
  7. 计算机数学渤海船舶职业学院,渤海船舶职业学院2020年高职扩招录取原则
  8. flask html缓存,flask_cache如何缓存动态数据,如何调用缓存数据
  9. 如何复制百度文库中需要收费的文字
  10. 破解lockdir的加密文件
  11. Ubuntu 10.10 下安装spoonwep-wpa工具
  12. Bulma 教程,Bulma 指南,Bulma 实战,Bulma 中文手册
  13. layui模板引擎不生效解决方案
  14. 小米平板完整bios_小米平板bios设置u盘启动操作步骤
  15. Mac使用技巧:轻松自定义设置系统键盘
  16. 【小迪实地】Webdav安全配置相关与漏洞利用
  17. Python使用selenium模拟登陆,截取图片验证码并转化为base64
  18. Fw:[一恒茶社] 作为大学教师,我 感到羞耻??教师节有感及其他[转贴]
  19. C#由于从未加载设计器
  20. vue垂死挣扎系列(一)——vue-cli快速搭建

热门文章

  1. WP8.1 Study17:网络之后台下载/上传及HttpClient
  2. java如何求迭代器长度_获取handlebar java中迭代器列表的长度
  3. LG30刷小米系统_小米红米手机刷原生安卓lineage、Pixel Experience、RRos教程
  4. 机器学习:Gan(生成对抗网络)
  5. 永久取消EXCEL 2007中邮箱地址的自动链接
  6. 《Visual C# 程序设计》课程学习(10)——第10章 Windows 窗体应用程序开发
  7. springboot 整合健康检查actuator <dependency> <groupId>org.springframework.boot</groupId>
  8. PTA-统计大写辅音字母(详细)
  9. 【毕业设计-免费】springboot+vue前后端分离-酒店客房管理系统
  10. 说到劈腿出轨 还真不一定都是男方的过错,至少数据分析出来的结论是这样的...