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语句可以有效的自动释放掉资源. 实在没有办法 ...
随机推荐
- 《深入浅出WPF》读书笔记
依赖属性: 节省实例对内存的开销: 属性值可以通过Binding依赖到其他对象上. WPF中,依赖对象的概念被DependencyObject类实现,依赖属性被DependencyProperty类实 ...
- CentOS7系列--1.3CentOS7用户管理
CentOS7用户管理 1. 添加用户 [root@centos7 ~]# useradd jack [root@centos7 ~]# passwd jack Changing password f ...
- 【转】Twitter Storm: 在生产集群上运行topology
Twitter Storm: 在生产集群上运行topology 发表于 2011 年 10 月 07 日 由 xumingming 作者: xumingming | 可以转载, 但必须以超链接形式标明 ...
- Django 模板继承extend 标签include block
# block 站网页位置# includ 导入网页标签# extends 导入网页模板 # common_js.html <script src="/static/plugins/j ...
- web应用服务端cache策略初探
一般来说,网站随着访问量以及数据库的增大,访问速度将会越来越慢,如何优化这个响应速度,增大用户支持容量是网站从小到中,到大的必经之路. 你也可能听说过对于大型web站点一般严重依赖于cache来弹性放 ...
- ssh终端常用快捷键
ssh终端常用快捷键 快捷键 描述 Ctrl+a 光标移动到行首 Ctrl+e 光标移动到行尾 Ctrl+c 终止当前程序 Ctrl+d 删除光标前的字符,或者推出当前中断 Ctrl+l 清屏 Ctr ...
- C# 运行 C#代码脚本文件
https://files.cnblogs.com/files/LittleJin/CSScriptRun.zip
- Java中对文件的序列化和反序列化
public class ObjectSaver { public static void main(String[] args) throws Exception { /*其中的 D:\\objec ...
- C# 调用WebService服务
方 法 一 : 选择项目,右键添加服务引用,输入服务地址,如图: 点击确定跳转到如下界面: 调用 接口: ServiceReference1.ImportDataServiceClient sr = ...
- UIButton的两种block传值方式
UIButton的两种block传值方式 方式1 - 作为属性来传值 BlockView.h 与 BlockView.m // // BlockView.h // Block // // Create ...