一、标记-清除算法(Mark-Sweep)

这种算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

Mark-Sweep 算法是最基础的收集算法,几乎所有的收集算法都是基于这种思路并对其不足进行改进而得到。它的不足之处主要有两个:

  • 效率问题。标记和清除两个过程的效率都不高;
  • 空间问题。标记清除之后会产生大量的内存碎片,空间碎片太多可能会导致在需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

二、复制算法(Copying)

这种算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完了,就将标记存活的对象复制到另外一块上面,然后再把已使用的半区空间一次性清理掉。

Copying 算法每次都只对半区进行回收,很好的解决了内存碎片的问题,而且实现简单,运行高效。

该算法的不足之处在于:

  • 将内存缩小为原来的一半,代价高昂,并且需要额外空间做分配担保。
  • 在对象存活率较高的时就要进行较多的复制操作,效率降低。

现在的商用虚拟机都采用这种收集算法来回收新生代。虚拟机将新生代内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间(默认比例是 8:1:1),每次分配对象时,使用 Eden 和其中一块 Survivor 空间,当进行垃圾回收时,将 Eden 和 Survivor 标记存活的对象复制到另外一块 Survivor 空间上,然后一次清理掉 Eden 和刚才用过的 Survivor 空间。当然,我们没有办法保证每次回收都只有不多余 10% 的对象存活,当 Survivor 空间不够用时,需要依赖其他内存(这里指老年代)进行分配担保。

三、标记-整理算法(Mark-Compact)

这种算法分为“标记”和“整理”两个阶段:首先标记出所有需要回收的对象,然后让所有存活的对象都向一端移动,接着直接清理掉端边界以外的内存。

Mark-Compact 算法在解决内存碎片的同时,避免 Copying 算法的空间浪费和效率问题。

四、分代收集算法(Generational Collection)

这种算法根据对象存活周期的不同将内存划分为几块,一般把 Java 堆分为新生代和老生代。

在新生代,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用 Copying 算法,只要付出少量存活对象的复制成本就可以完成收集。

在老生代,对象存活率高,没有额外空间对它进行担保,就必须使用 Mark-Sweep 或者 Mark-Compact 算法。

JVM系列二(垃圾收集算法).的更多相关文章

  1. jvm系列 (二) ---垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目 ...

  2. 深入理解java虚拟机系列二——垃圾收集算法

    在主流的商用程序语言中大多都是用根搜索算法(GC Roots Tracing)判断对象是否存活,比如java,c#等.当从GC Roots到某个对象不可达,则证明此对象是不可用的,将要被回收. 商业虚 ...

  3. jvm系列(三):GC算法 垃圾收集器

    原文出处:纯洁的微笑 这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理. 概述 垃圾收集 Garbage Collection 通常被称为"GC" ...

  4. 深入理解JVM(二)--垃圾收集算法

    一. 概述 说起垃圾收集(Garbage Collection, GC), 大部分人都把这项技术当做Java语言的伴随生产物. 事实上, GC的历史远远比Java久远, 1960年 诞生于MIT的Li ...

  5. JVM三种垃圾收集算法思想及发展过程

    JVM垃圾收集算法的具体实现有很多种,本文只是介绍实现这些垃圾收集算法的三种思想和发展过程.所有的垃圾收集算法的具体实现都是遵循这三种算法思想而实现的. 1.标记-清除算法 标记-清除(Mark-Sw ...

  6. JVM探秘:垃圾收集算法

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 垃圾收集算法 垃圾收集算法主要有标记-清除算法.复制算法.标记-整理算法.分代收集算法 ...

  7. 「给产品经理讲JVM」:垃圾收集算法

    纠结的我,给我的JVM系列终于起了第三个名字,害,我真是太难了.从 JVM 到 每日五分钟,玩转 JVM 再到现在的给产品经理讲 JVM ,虽然内容为王,但是标题可以让更多的人看到我的文章,所以,历经 ...

  8. JVM系列二:垃圾回收

    什么时候回收对象 引用计数法 1.原理:为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1.引用计数为 0 的对象可被回收. 2.缺点:无法解决循环引用问题 可达性分析 ...

  9. JVM GC之垃圾收集算法

    1.垃圾收集概念 GC目的 分配内存,为每个新建的对象分配空间 确保还在使用的对象的内存一直还在,不能把有用的空间当垃圾回收了 释放不再使用的对象所占用的空间 我们把还被引用的对象称为活的,把不再被引 ...

随机推荐

  1. android 网络异步加载数据进度条

    ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...

  2. (四)OpenStack---M版---双节点搭建---Glance安装和配置

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 1.创建glance数据库 2.获得 admin 凭证来获取只有管理员能执行的命令的访问权限 3 ...

  3. /proc/cpuinfo文件解读(超易理解)

    在linux系统中,提供了/proc目录下文件,显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以查/proc/cpuinfo.但是此文件输出项较多,不易理解.例如我们想获取, ...

  4. 了解HTTP协议,这一篇就够了

    ​HTTP(Hyper Text Transfer Protocol:超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的 ...

  5. WebGPU学习(一): 开篇

    介绍 大家好,本系列从0开始学习WebGPU API,并给出相关的demo. WebGPU介绍 WebGPU相当于DX12/Vulkan,能让程序员更灵活地操作GPU,从而大幅提升性能. 为什么要学习 ...

  6. Ubuntu中git pull远程仓库时显示403错误

    # 报错内容 fatal: unable to access 'https://git.dev.tencent.com/chendongnan/sfedu_wx.git/': The requeste ...

  7. 【CKB.DEV 茶话会】如何在 CKB 上实现用户自定义 Token

    本贴内容主要来自于 CKB.DEV 茶话会第一期,本期主题是:如何在 CKB 上实现 UDT,分享人是:Cipher 王博. 茶话会现场视频: https://v.qq.com/x/page/x303 ...

  8. 【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图【华为云技术分享】

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...

  9. 用C在GBA上写光线追踪(0)配置开发编译环境

    前段时间用C#写了一个光线追踪程序,可以渲染圆球,平面这种基本图形,反射,光照,阴影,都大致尝试做了一下. ↑ C#实现的光线追踪     ↑ GBA上C实现的光线追踪 然而,在我打算继续深入优化的时 ...

  10. Creating your first iOS Framework

    转自:https://robots.thoughtbot.com/creating-your-first-ios-framework If you’ve ever tried to create yo ...