JVM 在垃圾回收的时候:

① 到底使用了哪些垃圾回收算法?

② 分别在什么场景下使用?

③ 各自的优缺点?

下面就来正式的介绍下垃圾回收算法

标记-清除

标记清除是最简单和干脆的一种垃圾回收算法,他的执行流程是这样子的:当 JVM 标记出内存中的垃圾以后,直接将其清除,但是这样有一个很明显的缺点,就是会导致内存空间的不连续,也就是会产生很多的内存碎片。先画个图来看下

我们使用上图左边的图来表示垃圾回收之前的样子,黑色的区域表示可以被回收的垃圾对象。这些对象在内存空间中不是连续的。右侧这张图表示是垃圾回收过后的内存的样子。可以很明显的看到里面缠身了断断续续的 内存碎片。

那说半天垃圾不是已经被回收了吗?内存碎片就内存碎片呗。又能咋地?好,我来这么告诉你,现在假设这些内存碎片所占用的口空间之和是1 M,现在新创建了一个对象大小就是 1 M,但是很遗憾的是,此时内存空间虽然加起来有 1 M,但是并不是连续的,所以也就无法存放这大对象。也就是说这样势必会造成内存空间的浪费,这就是内存碎片的危害。

这么一说标记-清除就没有优点了吗?优点还是有的:速度快

到此,我们来对标记-清除来做一个简单的优缺点小结

# 优点速度快,因为不需要移动和复制对象
# 缺点会产生内存碎片,造成内存的浪费

标记-复制

上面的清除算法真的太差劲了。都不管后来人能不能存放的下,就直接啥也不管的去清除对象。所以升级后就来了复制算法。复制算法的工作原理是这样子的:首先将内存划分成两个区域。新创建的对象都放在其中一块内存上面,当快满的时候,就将标记出来的存活的对象复制到另一块内存区域中(注意:这些对象在在复制的时候其内存空间上是严格排序且连续的),这样就腾出来一那一半就又变成了空闲空间了。依次循环运行。

在回收前将存活的对象复制到另一边去。然后再回收垃圾对象,回收完就类似下面的样子:

如果再来新对象被创建就会放在右边那块内存中,当内存满了,继续将存活对象复制到左边,然后清除掉垃圾对象。

标记-复制算法的明显的缺点就是:浪费了一半的内存,但是优点是不会产生内存碎片。所以我们再做技术的时候经常会走向一个矛盾点地方,那就是:一个新的技术的引入,必然会带来新的问题。

到这里我们来简单小结下标记-复制算法的优缺点

# 优点内存空间是连续的,不会产生内存碎片
# 缺点1、浪费了一半的内存空间2、复制对象会造成性能和时间上的消耗

说道里,似乎这两种垃圾回收回收算法都不是很好。而且在解决了原有的问题之后,所带来的新的问题也是无法接受的。所以又有了下面的垃圾回收算法

标记-整理

标记-整理算法是结合了上面两者的特点进行演化而来的。具体的原理和执行流程是这样子的:我们将其分为三个阶段:

第一阶段为标记

第二阶段为整理

标记:它的第一个阶段与标记-清除算法是一模一样的,均是遍历 GC Roots,然后将存活的对象标记。

整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。

我们是画图说话,下面这张图是垃圾回收前的样子。

下图图表示的第一阶段:标记出存活对象和垃圾对象;并清除垃圾对象

白色空间表示被清理后的垃圾。

下面就开始进行整理:

可以看到,现在即没有内存碎片,也没有浪费内存空间。

但是这就完美了吗?他在标记和整理的时候会消耗大量的时间(微观上)。但是在大厂那种高并发的场景下,这似乎有点差强人意。

到此,我们将标记-整理的优缺点整理如下:

# 优点1、不会产生内存碎片2、不会浪费内存空间
# 缺点太耗时间(性能低)

到此为止,我们已经了知道了标记-清除、标记-复制、标记-整理三大垃圾回收算法的优缺点,单纯的从时间长短上面来看:标记-清除 < 标记-复制 < 标记-整理

单纯从结果来看:标记-整理 > 标记-复制 >= 标记清除

7张图讲透Java垃圾回收算法!学妹直呼666!!!相关推荐

  1. go java 垃圾回收_Go/Java垃圾回收算法对比解析

    原标题:Go/Java垃圾回收算法对比解析 导读:GC 是大部分现代语言内置的特性,本文作者针对 Go 语言声称的 10ms 以下的 GC 停顿进行了深入分析,还同 Java 的垃圾收集器做了对比.G ...

  2. 6种java垃圾回收算法_Java垃圾回收机制

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  3. Java垃圾回收算法详解

    1 概述 在前一篇文章中讲到了Java虚拟机的基础知识和运行时数据区的划分,在运行时数据区的划分中,可分为线程共享区域和线程私有区域,而Java的垃圾回收就发生在线程共享区域中,更直观的说法就是Jav ...

  4. Java垃圾回收算法以及垃圾回收器

    文章目录 前言 JVM 内存区域 如何识别垃圾 引用计数法 可达性算法 虚拟机栈(栈帧中的本地变量表)中引用的对象 方法区中类静态属性引用的对象 方法区中常量引用的对象 本地方法栈中 JNI 引用的对 ...

  5. 6种java垃圾回收算法_被说烂了的Java垃圾回收算法,我带来了最“清新脱俗”的详细图解...

    一.概况 理解Java虚拟机垃圾回收机制的底层原理,是系统调优与线上问题排查的基础,也是一个高级Java程序员的基本功,本文就针对Java垃圾回收这一主题做一些整理与记录.Java垃圾回收器的种类繁多 ...

  6. 6种java垃圾回收算法_Java垃圾回收算法

    主要根据以下3篇博客做的整理 http://blog.csdn.net/zsuguangh/article/details/6429592 http://www.cnblogs.com/ywl925/ ...

  7. 被说烂了的Java垃圾回收算法,我带来了最“清新脱俗”的详细图解

    一.概况 理解Java虚拟机垃圾回收机制的底层原理,是系统调优与线上问题排查的基础,也是一个高级Java程序员的基本功,本文就针对Java垃圾回收这一主题做一些整理与记录.Java垃圾回收器的种类繁多 ...

  8. 内存分配算法java_被说烂了的Java垃圾回收算法,我带来了最“清新脱俗”的详细图解...

    一.概况 理解Java虚拟机垃圾回收机制的底层原理,是系统调优与线上问题排查的基础,也是一个高级Java程序员的基本功,本文就针对Java垃圾回收这一主题做一些整理与记录.Java垃圾回收器的种类繁多 ...

  9. 6种java垃圾回收算法_学习java垃圾回收

    垃圾回收(GC)一直是Java受欢迎背后的重要特性之一.垃圾回收是Java中用于释放未使用的内存的机制.本质上,它追踪所有仍在使用的对象,并将剩下的标记为垃圾.Java的垃圾回收被认为是一种自动内存管 ...

最新文章

  1. cs224n第一讲深度自然语言处理
  2. UA PHYS515A 电磁理论V 电磁波与辐射2 电磁波的能量
  3. android 之自定义Adapter的用法
  4. 首次吃了一颗带奶糖味的消炎药,不知道管用不
  5. OpenCASCADE:物理STEP文件
  6. sql 无法删除当前数据库,因为当前数据库正在使用
  7. 李宏毅机器学习课程2~~~误差从哪里来?
  8. 数据结构---Kruskal最小生成树
  9. java什么时候创建进程,Java创建进程
  10. ole db 错误 通讯链接失败_西门子PLC1200的S7通讯(同一项目下)--GET接收指令
  11. 解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)
  12. C++ 使用VS2010创建MFC ActiveX工程项目
  13. php将值作为数组,php – 如何将CSV解析为数组,并将第一个值作为键?
  14. cc2500的register操作
  15. 使用太乐地图下载器下载百度地图切片
  16. python logger handler_Python中的logger和handler到底是个什么鬼
  17. 黑苹果亮度调节 小太阳
  18. 详解鸽巢原理【组合数学】
  19. 如果成为一个合格的技术管理者
  20. lubuntu输入法设置_Ubuntu 18.04 16.04 设置输入法切换方法 中文输入法

热门文章

  1. java 标记_Java中的标记语句块?
  2. 讯飞智能录音笔SR101:考研的温暖陪伴
  3. C++使用localtime函数需要注意的地方
  4. 矩阵的运算及其运算规则
  5. mysql整除、取余、四舍五入
  6. AntiSpy:一款功能强大的反病毒反Rootkit免费工具套件
  7. Python 中 assert的使用位置及源码解析
  8. NHibernate第一个实例
  9. vue2.0中watch总结:普通监听和深度监听
  10. DevExpress中获取GridControl排序之后的List