JVM之垃圾收集机制四种GC算法详解
JVM之四种GC算法详解
目录:
- 什么是GC?
- GC算法之引用计数法
- GC算法之复制算法(Copying)
- GC算法之标记清除(Mark-Sweep)
- GC算法之标记压缩(Mark-Compact)
- GC算法之标记清除压缩(Mark-Sweep-Compact)
- 小结
1. 什么是GC?
先看图:
GC是分代收集算法
(更为专业)
- JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。
- 因此GC按照回收的区域又分两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC)
Minor GC 和 Full GC的区别
- 普通GC(minor GC):只针对在新生代区域的GC,指发生在新生代的垃圾收集动作,因为大多数Java对象存活率都不高,所以Minor GC非常频繁,一般回收速度也比较快。
- 全局GC(major GC or Full GC):指发生在老年代的垃圾收集动作,出现了Major GC,经常会伴随至少一次的Minor GC(但不是绝对的)。Major GC的速度一般要比Minor GC慢上10倍以上。
2. GC算法之引用计数法
即当对象的引用为0的时候会被回收。
3. GC算法之复制算法(Copying)
(1)概述:
年轻代使用的是Minor GC,这种GC算法采用的是复制算法。
(2)原理
- Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区放不下,那么剩下的活的对象就被移到Old generation中,也即一旦收集后,Eden是变成空的了。
- 当对象在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)复制算法的缺点:
- 浪费了一般的内存
- 如果对象的存活率很高,我们可以极端一点,假设100%存活,那么我们需要将所有对象都复制一遍,并将所有引用地址重置一遍,复制这一工作所花费的时间,在对象存活率达到一定程度时,将会变得不可忽视。所以从以上的描述中不难看出,
复制算法要想使用,最起码对象的存活率要非常低才行,而且最重要的是,我们必须克服50%内存的浪费
。
4. GC算法之标记清除(Mark-Sweep)
(1)概述:
- 老年代一般是由标记清除或者是标记清除与标记整理的混合实现
(2)原理
当堆中的有效内存空间(available memory)被耗尽的时候,就会停止整个程序(也被称为stop the world),然后进行两项工作,第一项则是标记,第二项则是清除。
- 标记:从引用根节点开始标记所有的被引用的对象。标记的过程其实就是遍历所有的GC Roots,然后将所有GC Roots可达的对象标记为存活的对象
- 清除:遍历整个堆,把未标记的对象清除。
(3)标记清除算法的缺点
- 此算法需要暂停整个应用,会产生内存碎片。
用通俗的话解释一下标记清除算法,就是当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会被触发并将程序暂停,随后将依旧存活的对象标记一遍,最终再将堆中所以没被标记的对象全部清除掉,接下来便让程序恢复运行。
(4)简单图:
5. GC算法之标记压缩(Mark-Compact)
(1)概述:
- 老年代一般是由标记清除或者是标记清除与标记整理的混合实现。
(2)原理
(3)标记压缩算法的缺点:
1.标记整理算法的唯一的缺点就是效率也不高
,不仅要标记所有存活对象,还要整理所有存活对象的引用地址。从效率上来说,标记整理算法要低于复制算法。
6. GC算法之标记清除压缩(Mark-Sweep-Compact)
(1)概念:
- 标记清除压缩,不属于四种GC算法。
流程图:
7. 小结
JVM之垃圾收集机制四种GC算法详解相关推荐
- 【JVM】四种GC算法(分代收集+三种标记算法)
目录 参考文章 四种GC算法 分代收集算法(理论) 标记清除算法 标记整理算法 标记复制算法 三种算法的优缺点 参考文章 JVM的4种垃圾回收算法.垃圾回收机制与总结_我是guyue,guyue就是我 ...
- mvc ajax提交html标签,Mvc提交表单的四种方法全程详解
Mvc提交表单的四种方法全程详解 2019-01-05 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了Mvc提交表单的四种方法全程详解,编程之家小编觉得挺不错的 ...
- 四种形态图解_中纪委”四种形态“指标体系详解
中纪委"四种形态"指标体系详解 中纪委自提出"四种形态"以来,官方.民间一直对"四种 形态"各包含什么内容, 在具体实践中如何应用, 存在较 ...
- 文件服务器文件多备份方案,FileYee数据备份四种备份方案详解
原标题:FileYee数据备份四种备份方案详解 其实有很多用户对FileYee数据备份软件不是特别熟悉,今天小编带大家了解一下FileYee的四种备份方案,一定会让大家对于数据备份有一个新的了解. 之 ...
- 9. PKI - 三种密钥交换算法详解(RSA DHE ECDHE)及他们在SSL/TLS协议中的应用
9. PKI - 三种密钥交换算法详解(RSA& DHE& ECDHE)及他们在SSL/TLS协议中的应用 RSA密钥交换算法 DHE密钥交换算法 ECDHE密钥交换算法 参考 密钥交 ...
- JVM(三)GC垃圾回收以及四种GC算法
JVM(三) 学习视频链接,以示尊重:https://www.bilibili.com/video/BV1iJ411d7jS?p=4 图片来源:https://blog.csdn.net/weixin ...
- JVM的四种GC算法
介绍 程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在 ...
- Java基础篇:四种代码块详解
所谓代码块,就是用大括号{}将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说,代码块是不能单独运行的,它必须有运行主体.在Java中代码块主要分为四种:普通代码块.静态代码块. ...
- mysql 秒杀 隔离级别_MySQL 四种隔离级别详解,看完吊打面试官
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
最新文章
- c++每调用一次函数+1_每个开发人员都应该知道的一些很棒的现代C ++功能
- uiuc工程学院计算机,UIUC计算机工程专业排名2020年
- VMware虚拟机中ubuntu的磁盘怎么扩容
- post 图片 byte 如何展示_图片展示:道路排水工程如何进行标准化施工
- MySQL数据库(三)
- Python爬虫从入门到放弃(二十一)之 Scrapy分布式部署
- 医疗物联网的定义的业务场景
- PHP解密小程序加密信息
- Win Server2016安装Glassfish4.1.2
- FindBugs 汇总(持续修改)
- 基于 Openocd 和 FT2232H 的 ARMv8(Coretex-A53)调试
- 浅谈eform自定义表单工具和协同办公系统
- android list 快速查找
- SkeyeExPlayer(Windows)开发系列之解决ffmpeg接口调用卡住的问题
- 两台电脑用网线直连传文件
- MongoDB填坑Can't find a codec for class org.springframework.data.mongodb.core.query.GeoCommand
- egret新手引导反向遮罩
- Flink 系例 之 CountWindowAll
- 高级计算机网络内容介绍,高级计算机网络-课程介绍课件.ppt
- 随性随笔_201508