保守式GC

保守式GC指“不能识别指针和非指针的GC”。

  1. 不明确的根,寄存器、调用栈。全局变量空间等属于GC root,这些GC均不能识别出是指针还是非指针。
  2. 指针的识别,在不明确的根的条件下可以已某种程度的精度来识别指针。
    1. 是否被正确对其
    2. 是否指向堆
    3. 是否指向对象的头

必须同时这三个基本的检查项目才可能是指针

  1. 不明确的根很可能出现数值但是同时满足以上三个条件产生"貌似指针的非指针(false point)",此时GC采取一种保守的态度,把所有可疑的引用均当作指针,因此称作保守式GC。
  2. 有点在于容易编写语言处理程序。
  3. 缺点则是识别指针的成本、错误识别指针导致垃圾变成存活对象和不能使用复制算法等移动对象的GC算法。

准确式GC

  1. 正确的根,可以直接识别出是指针还是非指针,都需要语言处理程序加工,即为准确式GC(Exact GC)
  2. 打标签,将不明确的根的所有非指针与指针区分开。32位系统的指针是4的倍数,低2位一定是0,因此可以让非指针左移一位,而后将最后一位置1,如果溢出则换一个大的数据类型。
  3. 不把寄存器和栈等当作根,而由处理程序来创建根。
  4. 优点在于不存在指针不明确,可以使用复制移动算法。
  5. 缺点则是需要语言处理程序对GC做支持,而且打标签等方式需要消耗资源与性能。

改进

间接引用

针对保守式GC不能使用复制算法

  • 保守式GC不能使用复制算法原因在于当某个根为false point时,对其指定的对象进行复制时将修改该根,但是该根其实质应该是具体的数值,这将导致程序异常。
  • 通过句柄(handle)来间接处理对象,所有的根只指向对象句柄,句柄再指向具体的对象,当移动对象时不需要改变根,只需要改变句柄的值。
  • 优点:保守式GC可以使用复制算法
  • 缺点:访问一次对象需要访问内存两次。

黑名单

针对保守式GC指针识别错误

  • 创建“需要注意 的地址的名单”,该黑名单里记录着“不明确的根内的非指针,其指向的是有可能被分配对象的地址”。
  • 面向黑名单内的地址分配小对象和没有子对象的对象可以降低由损失。

《垃圾回收的算法与实现》——保守式GC的更多相关文章

  1. 《垃圾回收的算法与实现》——GC标记-清除算法

    基本算法 标记-清除算法由 ==标记阶段== 和 ==清除阶段== 构成. 标记即将所有活动的对象打上标记. 清除即将那些没有标记的对象进行回收. 标记与清除 遍历GC root引用,递归标记(设置对 ...

  2. 《垃圾回收的算法与实现》——GC复制算法

    基本概念 GC复制算法将堆分成From和To两个内存块,当From被占满时GC将From中的存活对象复制到To中,同时将From和To交换. 通过递归遍历GC root(即采用深度优先)复制存活对象, ...

  3. JVM(八),垃圾回收标记算法

    八.垃圾回收标记算法 1.对象被判定成垃圾的标准 没有被其他对象引用 2.判断对象是否为垃圾的算法 (1)引用计数法 优点and缺点 (2)可达性分析算法

  4. 《垃圾回收的算法与实现》——增量式垃圾回收与RC Immix算法

    增量式垃圾回收 为了控制最大暂停时间,通过逐渐推进垃圾回收即垃圾回收与mutator交替执行. 三色标记算法 以标记-清除算法为例使用三色标记算法. 利用降低吞吐量来缩短最大停顿时间. 基础 将GC中 ...

  5. 垃圾回收基本算法 内存管理 GC大统一理论

    <垃圾收集> (豆瓣) https://book.douban.com/subject/1157908/ 第1章 简介1.1 内存分配的历史1.1.1 静态分配1.1.2 栈分配1.1.3 ...

  6. jvm入门及理解(六)——垃圾回收与算法

    一.jvm垃圾回收要做的事情 哪些内存需要回收 什么时候回收 怎么回收 二.如何判断对象已经死亡,或者说确定为垃圾 引用计数法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1: ...

  7. JVM 专题十八:垃圾回收(二)垃圾回收相关算法

    1. 标记阶段 1.1 引用计数算法 1.1.1 对象存活判断 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己 ...

  8. JVM——GC(垃圾回收)算法

    一.垃圾回收的基本概念 垃圾回收(GC,Garbage Collection),指内存中不会再被使用的对象清理掉. 垃圾回收有很多种算法:如引用计数法.标记压缩法.复制算法.分代/分区的思想 二.垃圾 ...

  9. 《垃圾回收的算法与实现》——Python垃圾回收

    Python垃圾回收 python采用引用计数法进行垃圾回收 Python内存分配 python在分配内存空间时,在malloc之上堆放了3个独立的分层. python内存分配时主要由arena.po ...

随机推荐

  1. linux环境下的mysql,httpd以及与宿主机的调试问题总结

    1. 首先www服务器,在宿主主机浏览器无法访问? (1)修改linux的防火墙,允许宿主主机ip访问即可. (2)关闭防火墙,即可访问. service iptables stop; 2. mysq ...

  2. 磁盘配额(Quota)的应用与实践

    1>什么是Quota      在Linux中,由于是多用户,多任务的环境,所以会有多用户共同使用一个硬盘空间的情况发生,如果其中有少数几个用户大量占用掉了硬盘空间的话,那肯定影响其他用户的使 ...

  3. 团队作业第四周(HCL盐酸队)——项目冲刺(第一篇)

    任务认领情况: 1.坦克类实现:李密,卢泰佑 2.子弹类,线程类实现:黄国航 赖少勇 3.画笔类,地图的实现:陈舒标  黄宇航 明日任务安排: 今天在通过已经购买的GUI书籍的帮助下,已经实现了界面的 ...

  4. SpringBoot相知

    前言 这篇文章的将介绍表单验证,AOP处理请求和统一异常处理,案例是延续上一篇 SpringBoot初识 表单验证 现在将要拦截未满18岁的女生,在之前GirlController里面添加一个女生的方 ...

  5. 实现EventHandler的监测

    的监测", "category":"", "tags":"", "publish":&qu ...

  6. 使用hadoop-daemon.sh 启动bootstrapStandby nameNode异常

    使用hadoop-daemon.sh 启动bootstrapStandby nameNode异常 启动bootstrapStandby nameNode时,直接通过ssh 过去执行该命令,一直无法成功 ...

  7. Kafka consumer的参数

    earliest: 当各分区下有已提交的offset时,从提交的offset开始消费:无提交的offset时,从头开始消费 latest :当各分区下有已提交的offset时,从提交的offset开始 ...

  8. Windows10 家庭版添加【本地组策略编辑器】

    Windows10 家庭版默认没有[本地组策略编辑器],添加方法: 新建记事本复制以下内容 @echo off pushd "%~dp0" dir /b C:\Windows\se ...

  9. 几条shell命令

    windows: route add 158.0.0.0 mask 255.0.0.0 158.137.38.1 metric 3 linux: netstat -apn  查看所有端口使用,可查看端 ...

  10. Day 27 类的进阶-反射

    11. __new__ 和 __metaclass__ 阅读以下代码: 1 2 3 4 5 6 class Foo(object): def __init__(self): pass obj = Fo ...