JVM之四种GC算法详解


目录:

  1. 什么是GC?
  2. GC算法之引用计数法
  3. GC算法之复制算法(Copying)
  4. GC算法之标记清除(Mark-Sweep)
  5. GC算法之标记压缩(Mark-Compact)
  6. GC算法之标记清除压缩(Mark-Sweep-Compact)
  7. 小结

1. 什么是GC?


先看图:

GC是分代收集算法(更为专业)

  1. JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。
  2. 因此GC按照回收的区域又分两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC)

Minor GC 和 Full GC的区别
  1. 普通GC(minor GC):只针对在新生代区域的GC,指发生在新生代的垃圾收集动作,因为大多数Java对象存活率都不高,所以Minor GC非常频繁,一般回收速度也比较快。
  2. 全局GC(major GC or Full GC):指发生在老年代的垃圾收集动作,出现了Major GC,经常会伴随至少一次的Minor GC(但不是绝对的)。Major GC的速度一般要比Minor GC慢上10倍以上。

2. GC算法之引用计数法


即当对象的引用为0的时候会被回收。


3. GC算法之复制算法(Copying)


(1)概述:

  1. 年轻代使用的是Minor GC,这种GC算法采用的是复制算法。

(2)原理

  1. Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区放不下,那么剩下的活的对象就被移到Old generation中,也即一旦收集后,Eden是变成空的了。
  2. 当对象在Eden(包括一个Survivor区域,这里假设是from区域)出生后,在经过一次Minor GC后,如果对象还存活,并且能够被另一块Survivor区域所容纳(上面假设是from区域,这里应为to区域,即to区域有足够的内存空间来存储Eden和from区域存活的对象),则使用复制算法将这些仍然还存活的对象复制到另外一款Survivor区域(即to区域)中,然后清理所使用的Eden和Survivor(即from区域),并且这些对象的年龄设置为1,以后对象在Survivor区域每熬过一次Minor GC,就将对象的年龄+1,当对象的年龄达到某个值时(默认是15岁,通过 -XX:MaxTenuringThreshold来设定对象在新生代中存活的次数),这些对象就会成为老年代。
  3. 复制算法的基本思想是将内存分为两块,每次只用到其中一块,当这一块内存用完,就将活着的对象复制到另外一块上面。复制算法不会产生空间碎片

(3)复制算法的缺点:

  1. 浪费了一般的内存
  2. 如果对象的存活率很高,我们可以极端一点,假设100%存活,那么我们需要将所有对象都复制一遍,并将所有引用地址重置一遍,复制这一工作所花费的时间,在对象存活率达到一定程度时,将会变得不可忽视。所以从以上的描述中不难看出,复制算法要想使用,最起码对象的存活率要非常低才行,而且最重要的是,我们必须克服50%内存的浪费



4. GC算法之标记清除(Mark-Sweep)


(1)概述:

  1. 老年代一般是由标记清除或者是标记清除与标记整理的混合实现

(2)原理

当堆中的有效内存空间(available memory)被耗尽的时候,就会停止整个程序(也被称为stop the world),然后进行两项工作,第一项则是标记,第二项则是清除。
  1. 标记:从引用根节点开始标记所有的被引用的对象。标记的过程其实就是遍历所有的GC Roots,然后将所有GC Roots可达的对象标记为存活的对象
  2. 清除:遍历整个堆,把未标记的对象清除。

(3)标记清除算法的缺点

  1. 此算法需要暂停整个应用,会产生内存碎片。

用通俗的话解释一下标记清除算法,就是当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会被触发并将程序暂停,随后将依旧存活的对象标记一遍,最终再将堆中所以没被标记的对象全部清除掉,接下来便让程序恢复运行。


(4)简单图:





5. GC算法之标记压缩(Mark-Compact)


(1)概述:

  1. 老年代一般是由标记清除或者是标记清除与标记整理的混合实现。

(2)原理


(3)标记压缩算法的缺点:

1.标记整理算法的唯一的缺点就是效率也不高,不仅要标记所有存活对象,还要整理所有存活对象的引用地址。从效率上来说,标记整理算法要低于复制算法。


6. GC算法之标记清除压缩(Mark-Sweep-Compact)


(1)概念:

  1. 标记清除压缩,不属于四种GC算法。


流程图:



7. 小结



JVM之垃圾收集机制四种GC算法详解相关推荐

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

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

  2. mvc ajax提交html标签,Mvc提交表单的四种方法全程详解

    Mvc提交表单的四种方法全程详解 2019-01-05 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了Mvc提交表单的四种方法全程详解,编程之家小编觉得挺不错的 ...

  3. 四种形态图解_中纪委”四种形态“指标体系详解

    中纪委"四种形态"指标体系详解 中纪委自提出"四种形态"以来,官方.民间一直对"四种 形态"各包含什么内容, 在具体实践中如何应用, 存在较 ...

  4. 文件服务器文件多备份方案,FileYee数据备份四种备份方案详解

    原标题:FileYee数据备份四种备份方案详解 其实有很多用户对FileYee数据备份软件不是特别熟悉,今天小编带大家了解一下FileYee的四种备份方案,一定会让大家对于数据备份有一个新的了解. 之 ...

  5. 9. PKI - 三种密钥交换算法详解(RSA DHE ECDHE)及他们在SSL/TLS协议中的应用

    9. PKI - 三种密钥交换算法详解(RSA& DHE& ECDHE)及他们在SSL/TLS协议中的应用 RSA密钥交换算法 DHE密钥交换算法 ECDHE密钥交换算法 参考 密钥交 ...

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

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

  7. JVM的四种GC算法

    介绍 程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在 ...

  8. Java基础篇:四种代码块详解

    所谓代码块,就是用大括号{}将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说,代码块是不能单独运行的,它必须有运行主体.在Java中代码块主要分为四种:普通代码块.静态代码块. ...

  9. mysql 秒杀 隔离级别_MySQL 四种隔离级别详解,看完吊打面试官

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

最新文章

  1. c++每调用一次函数+1_每个开发人员都应该知道的一些很棒的现代C ++功能
  2. uiuc工程学院计算机,UIUC计算机工程专业排名2020年
  3. VMware虚拟机中ubuntu的磁盘怎么扩容
  4. post 图片 byte 如何展示_图片展示:道路排水工程如何进行标准化施工
  5. MySQL数据库(三)
  6. Python爬虫从入门到放弃(二十一)之 Scrapy分布式部署
  7. 医疗物联网的定义的业务场景
  8. PHP解密小程序加密信息
  9. Win Server2016安装Glassfish4.1.2
  10. FindBugs 汇总(持续修改)
  11. 基于 Openocd 和 FT2232H 的 ARMv8(Coretex-A53)调试
  12. 浅谈eform自定义表单工具和协同办公系统
  13. android list 快速查找
  14. SkeyeExPlayer(Windows)开发系列之解决ffmpeg接口调用卡住的问题
  15. 两台电脑用网线直连传文件
  16. MongoDB填坑Can't find a codec for class org.springframework.data.mongodb.core.query.GeoCommand
  17. egret新手引导反向遮罩
  18. Flink 系例 之 CountWindowAll
  19. 高级计算机网络内容介绍,高级计算机网络-课程介绍课件.ppt
  20. 随性随笔_201508

热门文章

  1. 理解 Neutron FWaaS - 每天5分钟玩转 OpenStack(117)
  2. Python命令行自动补全和记录历史命令
  3. Linux驱动中获取系统时间
  4. 设计模式(创建型)之原型模式
  5. Linux下bash的PS1
  6. [翻译]XNA建设者俱乐部在线网站上的社区新亮点
  7. 牛客多校3 - Two Matchings(dp)
  8. tensorflow包_在Keras和Tensorflow中使用深度卷积网络生成Meme(表情包)文本
  9. 数据科学竞赛-自然语言处理赛流程
  10. TensorFlow2-高阶操作