保守式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兴趣小组2014级免试挑战题

    原文链接:西邮Linux兴趣小组2014级免试挑战题 又到了小组纳新的季节^_^,时间过的真快! 想起去年这会儿自己做免试题的时候根本找不着北@_@  有幸今年能够在这里和大家分享免试挑战题,也正如我 ...

  2. chrome 概述

    Chrome, Firebug, Filddle 调试:http://www.zhihu.com/question/35667558/answer/63936233 Chrome开发者工具系列: ht ...

  3. hdu 2780 Su-Su-Sudoku(DFS数独)

    题目链接:hdu2780 #include<stdio.h> #include<string.h> #include<queue> #include<math ...

  4. Bitcoin

    看李笑来老师的2013演讲——Bitcoin is not virtual currency,it is a real world. 1.由于bitcoin的算法中进行有上限量的发布,所以这是不会出现 ...

  5. Oracle EBS 常用网站列表

    http://www.lifandong.com/erp/356 Oracle EBS 常用网站列表 英文站: Oracle EBS R12 官方参考手册(User Guide, Implementa ...

  6. 单元测试工具Numega BoundsChecker

    1 前言 我在本文中详细介绍了测试工具NuMega Devpartner(以下简称NuMega)的使用方法. NuMega是一个动态测试工具,主要应用于白盒测试.该工具的特点是学习简单.使用方便.功能 ...

  7. navigationController背景图,文字,事件定义

    //设置背景图片 [self.navigationController.navigationBar setBackgroundImage:imag forBarMetrics:UIBarMetrics ...

  8. AbpZero的Swagger汉化之旅

    做汉化主要是为了出一份前后端都能看得懂的在线文档,废话不多说,我们开始准备, 我们要在启动项目的Startup.cs中重定向一下swagger的读取方式 1.在这个类下面,新增一个方法: public ...

  9. C# winform 去掉button的边框颜色

    Winform的话,设置FlatStyle为Flat,并且设置FlatAppearance下的BorderSize为0,foreColor设置成web下的Transparent

  10. C# AutoMapper 了解一下

    什么是AutoMapper? 简单来说就是将一个对象映射到另一个对象的代码. 摆脱了繁琐的赋值过程 (最常见也就是Model -——ViewModel) AutoMapper安装 我使用的是VS201 ...