GC四大算法
引言:
前面的文章提到,Heap包括了PSYoungGen、ParOldGen、Metaspace。JVM 在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是新生代。由于新生代和老年代的内存空间大小不同以及对象存活率不同,所以针对不同区域JVM采用了不同的GC,不同的GC是通过不同的算法实现的。在Jdk8中,按照回收区域的不同,把GC分为工作在新生代的普通GC(minor GC)和工作在堆全局空间的全局GC(Full GC)。
由于新生代和老年代占比空间为1:2,且采用了不同的算法,所以minor GC 的速度要比Full GC快很多。
一、复制算法
HotSpot 把新生代分为三个部分:Eden区和两个Survivor区(From区和To区),默认比例8:1:1。对象创建时会被放在Eden区,当Eden区触发GC(minor GC),GC会对Eden和Survivor区进行垃圾回收,幸存下来的独享会被 “复制” 到Survivor1区(To区),然后清空Eden和From区,最后将To和From交换,让刚才被清空的From作新的To区,让刚才保存对象的To区作新的From区,以保证下一次GC可以扫描到这些对象。这个过程中涉及到了一个 “复制” 的操作,就是 “复制算法” 的产物。顺带一提:当一个对象在多次GC后依然无法被回收,在From区和To区来回复制,没复制一次“年龄”加1,一旦“年龄”达到MaxTenuringThreshold的值(默认为15)就会被移动到老年代。
为了方便描述,这里将minor GC的扫描区域(Eden、From)简称为From区,因为这两块区域的共同特点就是在复制幸存对象到To区后会被清空,唯一的区别就是Eden用来保存第一次new出来的对象,而From区保存的则是经过若干次GC后任然幸存的对象。
整个流程如下图所示:

红色为幸存对象,黄色为被GC回收的对象,绿色表示闲置空间。当触发GC后,Eden区和From区的幸存对象会被复制到To区,然后清空Eden区和From区,最后将From区和To区对调,以保证下一次GC的正常工作流程。这些内容在前面介绍堆参数时也有提及,这里不再赘述。需要补充的是 “复制算法” 的优缺点:
优点:1、由于“复制算法”采用了复制—清空的方法,所以不会导致内存空间的碎片化
缺点:1、由于复制算法需要另外的空间来 “周转” 这些幸存的对象,所以内存消耗比较大。
2、如果存在“极端情况”,比如大量的对象循环引用而导致无法回收的幸存对象占比很大,假设为80%,那么就需要将这些数量庞大的对象都复制一遍,并将所有的引用地址重置一遍,这回耗费比较多的时间。所以复制算法的最佳工作环境就是这一块的对象存活率比较低。
二、标记清除
这是GC在老年代中的工作方式,标记清除算法分为两个阶段:标记阶段和清除阶段。

这种算法虽然不需要多余的内存空间 “周转” 对象,但是会导致内存碎片化。于是便引出了标记压缩算法
三、标记压缩
标记压缩其实就是在标记清除后加了一个 “压缩” 操作,将分散的数据压缩到一块连续的内存空间。就是慢,但慢工出细活。

四、更加优秀的选择
针对老年的GC,标记清除和标记压缩都不完美,最好的方式是组合使用,在多次使用标记清除后进行一次压缩。总的来说四种方式没有孰优孰劣,只有谁更合适。总结一下就是:
执行效率(算法的时间复杂度):复制算法>标记清除>标记压缩
内存整齐度:复制算法=标记压缩>标记清除
内存利用率:标记清除=标记压缩>复制算法
在Java9默认采用了G1垃圾回收器,采用了时间复杂度和空间利用率都非常出色的算法。
GC四大算法的更多相关文章
- 【JVM】垃圾回收的四大算法
GC垃圾回收 JVM大部分时候回收的都是新生代(伊甸区+幸存0区+幸存1区).按照回收的区域可以分成两种类型:Minor GC和Full GC(MajorGC). Minor GC:只针对新生代区域的 ...
- 初步了解JVM第三篇(堆和GC回收算法)
在<初步了解JVM第一篇>和<初步了解JVM第二篇>中,分别介绍了: 类加载器:负责加载*.class文件,将字节码内容加载到内存中.其中类加载器的类型有如下:执行引擎:负责解 ...
- 《垃圾回收的算法与实现》——GC复制算法
基本概念 GC复制算法将堆分成From和To两个内存块,当From被占满时GC将From中的存活对象复制到To中,同时将From和To交换. 通过递归遍历GC root(即采用深度优先)复制存活对象, ...
- 【转载】GC基本算法及C++GC机制
原文: GC基本算法及C++GC机制 阅读目录 前言 基本概念 有向可达图与根集 三种基本的垃圾收集算法及其改进算法 1.引用计数算法 2. Mark & Sweep 算法 3. 节点复制算法 ...
- GC回收算法
GC回收算法 https://www.cnblogs.com/missOfAugust/p/9528166.html Java语言引入了垃圾回收机制,让C++语言中令人头疼的内存管理问题迎刃而解,使得 ...
- GC回收算法--当女友跟你提分手!
Java语言引入了垃圾回收机制,让C++语言中令人头疼的内存管理问题迎刃而解,使得我们Java狗每天开开心心地创建对象而不用管对象死活,这些都是Java的垃圾回收机制带来的好处.但是Java的垃圾回收 ...
- GC回收算法&&GC回收器
GC回收算法 什么是垃圾? 类比日常生活中,如果一个东西经常没被使用,那么就可以说是垃圾. 同理,如果一个对象不可能再被引用,那么这个对象就是垃圾,应该被回收. 垃圾:不可能再被引用的对象. fina ...
- java虚拟机学习总结之GC回收算法与GC收集器
GC回收算法 1.标记清除算法分为标记阶段和清除阶段标记阶段:通过特定的判断方式找出无用的对象实例并将其标记清除阶段:将已标记的对象所占用的内存回收缺点:运行多次以后容易产生空间碎片,当需要一整段连续 ...
- JVM内存模型及GC回收算法
该篇博客主要对JVM内存模型以及GC回收算法以自己的理解和认识做以记录. 内存模型 GC垃圾回收 1.内存模型 从上图可以看出,JVM分为 方法区,虚拟机栈,本地方法栈,堆,计数器 5个区域.其中最为 ...
随机推荐
- 8.css背景
①Background-attachment背景图像是固定还是随着页面滚动.Scroll默认,fixed固定. ②Background-color背景颜色. ③Background-image把图像设 ...
- 破阵九解:Node和浏览器之事件循环/任务队列/异步顺序/数据结构
前言 本文内容比较长,请见谅.如有评议,还请评论区指点,谢谢大家! >> 目录 开门见山:Node和浏览器的异步执行顺序问题 两种环境下的宏任务和微任务(macrotask &&a ...
- CSS中各种布局的背后(*FC)
CSS中各种布局的背后,实质上是各种*FC的组合.CSS2.1中只有BFC和IFC,CSS3 中还增加了FFC和GFC. 盒模型(BoxModel) 上图为W3C标准盒模型,另外还有一种IE盒模型(I ...
- opencv::像素重映射
像素重映射(cv::remap) 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像. Remap( InputArray src, // 输入图像 Ou ...
- Pathon中numpy模块
目录 numpy模块 切割矩阵 矩阵元素替换 矩阵的合并 通过函数创建矩阵 fromstring/fromfunctions 矩阵的运算 常用矩阵运函数 矩阵的点乘 矩阵的逆 矩阵的其他操作 nump ...
- php中转菜刀脚本过狗免杀
<?php $target="url";//shell 地址 菜刀连这个脚本做中转 $post=''; $i=0; foreach($_POST AS $K=>$V) ...
- 第九周课程总结&实验报告(七)
实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 实验代码 pac ...
- 2.Linux Bash认识
虚拟机快照操作 1.什么是Bash shell? 它就是命令解释器,将用户输入的指令翻译给内核程序,内核处理完成之后将结果返回给Bash 2.Bash shell的用途? 几乎能完成所有的操作: 文件 ...
- 对比js库分枝Jquery和js获取对象的方式
一.Jquery和JS的认识 对于这点不谈详细,但能有一个能有一个全面的印象,Jquery本质上也是JS,只不过用一句话概括就是 “write letter and do more”,写的更少,做 ...
- SVG系列 - 基础
标题为SVG基础,但是过于基础的东西就不再熬述啦,可以参考几个学习网址: SVG参考手册:http://www.runoob.com/svg/svg-reference.html MDN SVG:ht ...