GC算法:基础

在介绍GC算法在实际场景中的实现之前,我们先定义一些必要的术语,以及GC算法的基本准则。具体的细节会因收集器的不同而稍有区别,但是基本上来说,所有的收集器会关注以下两个方面:

  1. 找出所有仍然存活的对象
  2. 清除掉其他所有非存活对象(被认为是dead,并且不会再被使用的对象)

在所有的收集器内部,第一步实现的均是:遍历出所有存活的对象。由标记(Marking)进程完成。

标记所有可达对象

在JVM中,任何主流GC算法均会以找出所有存活对象为开始。这个概念的解释可以参考下图:

首先,GC定义某些特定的对象为Garbage Collection Roots,一些典型的GC roots如:

  1. 当前执行的方法中的本地变量以及输入参数
  2. 当前活跃的线程
  3. 已载入的类中的静态区域
  4. JNI(Java Native Interface)引用

下一步,GC遍历内存里的整个对象图(whole object graph),从GC roots开始,遍历它们引用的所有对象。任何被GC访问到的对象会被标注为存活。

在上图中,蓝色的圆圈表示存活的对象。当Marking阶段完成时,所有存活的对象会被标注。所有其他对象(上图中的灰色圆圈)便是无法由GC roots访问到的对象,也就是说,你的应用无法再使用这些不可达的对象。这种对象被认为是垃圾,GC在清除它们时会经历以下阶段:

  1. 应用中的线程需要被停止,以便让Marking阶段正常运行。因为应用若是持续运行,则JVM里的对象可能随时在变化,这样就不足以获取到精确的信息。这个场景被称为一个安全点(safe point),它造成的结果便是一个Stop The World pause。Safe point可被不同的原因触发,但是到现目前为止,GC是引入safe point最常见的原因
  2. 这个暂停持续的时间并不取决于堆内存里对象的总数量,也不取决于堆内存的大小。它是由存活的对象个数决定的。所以,增加堆内存的大小并不会直接影响marking阶段的持续时间

Removing Unused Objects

不同的GC算法中,清楚unused objects的方式稍有不同。但是所有这类GC算法基本上可以分为以下三组:

  1. Sweeping
  2. Compacting
  3. Copying

Sweeping

Mark and Sweep 算法对于垃圾使用了最简单的方式:忽略掉这些对象。具体的说,就是在marking阶段完成后,所有没被访问到的对象所占据的空间,均被视为可用的空间。并可以被用于为新的对象分配。

这种方式使用到一种名为free-list的结构来记录每个空闲的区域(region)以及它的大小。free-list的管理方法会增加对象分配(object allocation)的开销。并且,它会有一个缺点:可能会存在大量的空闲region,但是如果单个region的空间不足以满足一个allocation,则这个allocation也会失败,并返回OutOfMemoryError的报错。

Compact

Mark-Sweep-Compact算法解决了Mark and Sweep的缺点。它将所有被标注为存活的对象移动到内存区域的起始。这种方法的缺点是增加了每次GC暂停的时间,因为我们需要将所有的对象移动到一个新的地方,并且更新它们的引用。它的优点也显而易见:在这个compacting操作完成后,对于新对象的分配会非常容易。使用这种方式,空余空间的地址随时可获取,并且也不会有碎片的问题。

Copy

Mark and Copy算法与Mark and Compact非常接近,因为它们都会重新allocate所有存活的对象。比较重要的不同点是:Mark and Copy 重分配的目标空间在一个不同的内存区域。它的优点是可以与Marking阶段并行执行。缺点是它需要一个足够大的额外内存区域,以支持所有的存活对象。

References:

https://plumbr.io/handbook/garbage-collection-algorithms

JVM垃圾回收(三)- GC算法:基础的更多相关文章

  1. JVM垃圾回收(GC)

    JVM垃圾回收(GC) 1. 判断对象是否可以被回收 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,但无法解决对象相互循环引用的问 ...

  2. JVM 垃圾回收(GC)机制

    目录 一.背景 二. 哪些内存需要回收? 1.引用计数算法 2 .可达性分析算法 三. 四种引用状态 1.强引用 2.软引用 3.弱引用 4.虚引用 对象死亡(被回收)前的最后一次挣扎 方法区如何判断 ...

  3. JVM垃圾回收机制GC

    1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...

  4. Java:JVM垃圾回收(GC)机制

    JVM垃圾回收算法 1.标记清除(Mark-Sweep) 原理: 从根集合节点进行扫描,标记出所有的存活对象,最后扫描整个内存空间并清除没有标记的对象(即死亡对象)适用场合: 存活对象较多的情况下比较 ...

  5. JVM垃圾回收(GC)原理

    一.基本垃圾回收算法 1.引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用则增加一个引用计数,删除一个引用则较少一个引用计数.垃圾回收时,只回收引用计数为0 ...

  6. jvm 垃圾回收机制和算法(转)

    stop-the-world 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC ...

  7. JVM——垃圾回收(GC)

    GC简单介绍 java语言执行在java虚拟机(jvm)上.为了解决有限的空间和性能的保证这个矛盾体,jvm所具备的GC能力.能够有效的清除不用的对象.使空间的利用更加合理.以下介绍该机制的原理. 推 ...

  8. JVM垃圾回收(GC)整理总结学习

    基本回收算法 1. 引用计数(Reference Counting)比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的对象.此算法最 ...

  9. jvm 垃圾回收概念和算法

    1.概念 GC 中的垃圾,特指存在于内存中.不会再被使用的对象.垃圾回收有很多种算法,如引用计数法.复制算法.分代.分区的思想. 2.算法 1.引用计数法:对象被其他所引用时计数器加 1,而当引用失效 ...

  10. JVM 垃圾回收 Minor gc vs Major gc vs Full gc

    关于垃圾回收机制及比较请参见:http://colobu.com/2015/04/07/minor-gc-vs-major-gc-vs-full-gc/ http://colobu.com/2014/ ...

随机推荐

  1. Oracle sql function LISTAGG

    select business_unit, voucher_id, listagg( vat_txn_type_cd, ',') within group (order by business_uni ...

  2. 关于SimpleDateFormat安全的时间格式化线程安全问题

    想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调 ...

  3. 利用Team@OSC进行团队协作开发平台

    利用Team@OSC进行团队协作开发平台 Team@OSC介绍 Team@OSC 是一个团队协作开发平台,轻松管理轻量级团队.代码运行平台(PaaS).代码质量检查应有尽有. 链接:https://t ...

  4. 易爆物D305

    分析:典型的并查集,每一个物品合一看成一个独立的顶点,则一个简单化合物就是一条边,如果两个顶点x,y联通则说明有危险,所以可以用一个并查集来维护图的联通分量集合,并查集的详解有一篇写的很易懂的博客并查 ...

  5. cookie和sission的原理及异同

    Cookie Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息.在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持. 通常有三个步骤来识别回头客: 服务器脚本发送 ...

  6. 关于 IIS 的 Management Service Delegation 配置 备份

    在MSDN没找到关于使用APPCMD备份IIS的"Management Service Delegation"模块配置命令. 到IIS的配置文件存放目录下,几番搜索,查到%wind ...

  7. Mysql+jsp连接记录

    1.下载tomacat 2.jsp项目的创建 3.tomacat和jsp挂钩起来 4.mysql下载 5.mysql可视化 6.随便写下sql语句 7.下载jdbc驱动 8.在jsp里面写 over!

  8. (纯干货)最新WEB前端学习路线汇总初学者必看

    Web前端好学吗?这是很多web学习者常问的问题,想要学习一门自己从未接触过的领域,事先有些了解并知道要学的内容,对接下来的学习会有事半功倍的效果.在当下来说web前端开发工程师可谓是高福利.高薪水的 ...

  9. TeamCity安装

    1 使用docker安装 安装手册:https://hub.docker.com/r/jetbrains/teamcity-server/2 安装包安装. docker run -it --name ...

  10. Jquery小功能实例

    下拉框内容选中左右移动 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Sele ...