C++垃圾回收器的实现
这是一个自己写C++垃圾自己主动回收器,用到的都是标准C++语法。採用了引用计数加mark-sweep的方法。在没有循环引用的情况下,引用计数能够保证垃圾实时得到回收;对于有循环引用的情况下,计数就不能回收了,这时就要用mark-sweep的方法。事实上全然使用mark- sweep的方法也是能够的,但有了引用计数,能够回收大量的非循环引用垃圾,降低最后的mark-sweep时的工作量。
考虑到大家的15分钟阅读热情,在说细节之前,先show一下这个指针怎么使用。顺便提一下,这个指针能够在Windows+MSVC和Linux+GCC下编译,使用。代码下载在http://download.csdn.net/source/267439
SmartPtr<B> b;
SmartPtr<A> a;
ArrayPtr<SmartPtr<A> > ps = new SmartPtr<A>[2];
ps[0] = pA;

{
auto_ptr<MyClass> myObj(new MyClass());
//. . . some other operations
//myObj will be freed automatically



class ObjectWrapper
ObjectWrapper *pWrapper;
T* operator->() {return getTarget();}
const T* operator->() const {return getTarget();}
SmartPtr<T>& operator=(T* p)
ObjectWrapper *old = pWrapper;
pWrapper = WrapperManager::getInstance()->getWrapper<T>(p);
SmartPtr<T>& operator=(const SmartPtr<T> &ptr)
if(pWrapper == ptr.pWrapper)//assign to self
return *this;
pWrapper = ptr.pWrapper;
SmartPtr(const SmartPtr<T>& ptr)
pWrapper = ptr.pWrapper;
pWrapper = WrapperManager::getInstance()->getWrapper<T>(pObj);
operator const T* () const
return getTarget();
return getTarget();
inline const T* getTarget() const
return static_cast<T*> (pWrapper->getTarget());
inline T* getTarget()
return static_cast<T*> (pWrapper->getTarget());
我们前面已经说过了,仅仅使用引用计数进行垃圾回收在有循环引用的情况下就会失效。因此我们须要更有效、更主动的回收算法。在进行更为主动的垃圾回收之前,须要解决的最主要的一个问题就是:什么样的对象是垃圾对象,也就是说,怎样将垃圾对象与非垃圾对象区分开来。 解决问题须要能做到以下两点:
1. 可以界定对象的大小和起始位置。
2. 可以分辨对象的当前使用状态,找出垃圾对象。
SmartPtr<A> pA;
B() { pA = new A(); }
SmartPtr<B> pB = new B();
1) 将全部的指针对象分成根指针和非根指针。可是我们并不知道根指针在什么地方创建,幸好,我们知道非根指针总是位于其它对象内部。我们依次检查pA,pB, 发现pA位于B对象内部,pB不位于不论什么对象内部,因此pB是根指针,pA不是。
这个工作不须要每次进行垃圾扫描时都反复进行,指针对象一旦生成,它的地位是不会变的,不可能从根指针变成非根指针,也不可能相反。仅仅是在两次垃圾扫描的间隙时间,会有新的指针生成,须要检查新生成的指针,确定新生成的指针的类型。
2) 对于每个根指针,訪问它仅仅向的对象,并对该对象内部的全部指针,反复这个过程。从pB,我们訪问到了B对象,然后在B对象内部,我们发现了pA指针,然后反复,从pA指针訪问到A对象,在A对象内部,没有发现不论什么指针。
每次訪问到一个对象,我们就将这个对象标记为可到达状态,因此,A对象和B对象都被标记为可到达状态。
3) 遍历全部的对象,没有被标记为可到达状态的对象就是垃圾,进行清除工作。

到此,一个完整的垃圾回收器就完毕了,是不是非常easy!?
1) 怎样确定一个对象的大小
2) 怎样找到全部的指针对象
3) 假设找到全部的用户对象
4) 假设确定一个指针是否在一个对象内部
5) 怎样调用对象的正确的析构函数进行析构
6) 怎样推断系统是否空暇以便进行垃圾回收
7) 垃圾回收线程与用户线程见的同步问题
8) 怎样处理对象的继承与多态
9) 性能与内存开销
C++垃圾回收器的实现的更多相关文章
- [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类
目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...
- JVM 垃圾回收器工作原理及使用实例介绍
IBM介绍文档:https://www.ibm.com/developerworks/cn/java/j-lo-JVMGarbageCollection/ Java 的新生代串行垃圾回收器中使用了复制 ...
- JVM 垃圾回收器工作原理及使用实例介绍(转载自IBM),直接复制粘贴,需要原文戳链接
原文 https://www.ibm.com/developerworks/cn/java/j-lo-JVMGarbageCollection/ 再插一个关于线程和进程上下文,待判断 http://b ...
- Thinking in java学习笔记之垃圾回收器如何工作
垃圾回收器使得java在堆上分配空间的速度可以和其他语言从堆栈上分配空间的速度媲美.
- C#.Net GC(garbage Collector) 垃圾回收器
以前一直以为gc的原理很简单,也就是分代处理堆数据,直到我的膝盖中了一箭(好吧 直到有天汪涛和我说他面试携程的面试题 关于服务器和 工作站gc 的区别)其实我当时尚不知道 工作站和服务器有什么区别更不 ...
- Java垃圾回收算法和垃圾回收器
基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除的算法最简单,主要是标记出来需要回收的对象,然后然后把这些对象在内存的信息清除.如何标记需要回收的对象,在上一篇文章里面已经有说明. 标记- ...
- Java GC系列(3):垃圾回收器种类
本文由 ImportNew - 好好先生 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这篇教程中我们将学习几种现有的垃圾回收器.在 ...
- JVM学习总结三——垃圾回收器
整两天再看调优分析的部分,发现实际运行环境下,还是要考虑配置垃圾回收器,所以这里就加一小章介绍一下. 首先来看一下HotSpot所支持回收期的关系图: 图中可以看到一共有7中垃圾回收器,以中间绿线为界 ...
- Java垃圾回收器
一.Java垃圾回收器要负责完成以下3个任务: 1.分配内存 2.确保被引用对象的内存不被错误回收 3.回收不再被引用的对象的内存空间 二.垃圾回收是一个复杂而又耗时的操作.如果JVM花费过多的时间在 ...
- 面试之C#--垃圾回收器什么时候回收?
每个对象只有在该对象不存在任何引用才会被垃圾回收起回收. 可以调用静态方法System.GC.Collect()垃圾回收器,但是不建议这么做: 用using语句可以有效的自动释放掉资源. 实在没有办法 ...
随机推荐
- 热血沙城-3.2移植-古月-cocos2dx源码
最近发现我去年学习2dx的时候移植过的一个游戏现在被放在网上出售 真是有点想笑 本人比较喜欢武侠风格的游戏,当时9秒开源了热血沙城 本着学习的态度 从2.1.2移植到3.2 用了一周的时间 中间各种 ...
- Keras vs. PyTorch
We strongly recommend that you pick either Keras or PyTorch. These are powerful tools that are enjoy ...
- join() 方法详解及应用场景
总结:join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用jo ...
- git常用命令简集
基础操作: 初始化git仓库: git init 提交到暂存区: git add “filename” 提交到分支: git commit -m "注释" 工作区状态: git s ...
- Executors相关的类(线程池)
一.概述 Java是天生就支持并发的语言,支持并发意味着多线程,线程的频繁创建在高并发及大数据量是非常消耗资源的,因为java提供了线程池.在jdk1.5以前的版本中,线程池的使用是及其简陋的,但是在 ...
- ext button 属性
var buttonName = new Ext.Button({ id:"buttonName", text:" ...
- iOS8 CIGlassDistortion滤镜的使用
iOS8 CIGlassDistortion滤镜的使用 此为CoreImage滤镜的使用 素材 效果 混合用图片 源码: // // ViewController.m // CIGlass // // ...
- 手把手教你制作AppPreview视频并上传到appStore进行审核
手把手教你制作AppPreview视频并上传到appStore进行审核 注意,你需要使用iMovie才能够制作AppPreview视频文件,用QuickTime录制的无效! 最终效果 1. 新建一个事 ...
- 清除右键菜单CMD入口
批处理代码 reg add "HKEY_CLASSES_ROOT\Directory\Background\shell\cmd" /v Extended /t REG_SZ
- SparkSql实现Mysql到hive的数据流动
今天去面试了一波,因为调度系统采用了SparkSql实现数据从Mysql到hive,在这一点上面试官很明显很不满我对于Spark的理解,19年的第一个面试就这么挂了. 有问题不怕,怕的是知道了问题还得 ...