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语句可以有效的自动释放掉资源. 实在没有办法 ...
随机推荐
- android studio *.apk does not exist on disk
Build -> Clean Project Restart Android Studio
- Maven + Spring4
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- House of Roman 实战
前言 这是前几天国外一个 老哥 提出的一种思路 ,学习了一下感觉其中的堆布局的手法还不错,做个分享与记录. 这种利用手法的主要特点是不需要 leak libc的地址,通过 堆内存的布局 和 堆相关的漏 ...
- text-overflow修剪文本,以省略号显示
overflow: hidden; 必须设置,不然无法修剪文本 white-space: nowrap; 规定段落中的文本不进行换行 text-overflow: ellipsis; 当文本溢出 ...
- Ubuntu清理系统垃圾 命令
请参考: 圾Ubuntu清理系统垃 Ubuntu 16.04提示boot分区空间不足解决办法
- Windows自带强大的入侵检测工具——Netstat 命令 查询是否中木马
Netstat命令可以帮助我们了解网络的整体使用情况.根据Netstat后面参数的不同,它可以显示不同的网络连接信息.Netstat的参数如图,下面对其中一些参数进行说明.如何检测本机是否有被中木马, ...
- Sql Server数据库备份脚本以及如何在阿里云云数据库RDS还原数据库(代码源自阿里云)
今天研究阿里云服务数据库的迁移,备份和还原的时候,在阿里云web后台发现了一个很好用的sql脚本,就默默地偷了过来,它可以支持全量备份,差异备份和日志备份,代码解释也都很清楚,我也尝试着跑了一下,性能 ...
- 更新tableView的某个cell
更新tableView的某个cell 异步加载完数据后更新某个cell,这应该是非常常见的使用方法了,我们经常会用reloadData. 效果: 源码: // // RootViewControlle ...
- pandas高级操作总结
1.pandas中的列的分位数 # 查看列的分位数 import pandas as pd # set columns type my_df['col'] = my_df['col'].astype( ...
- ASP.NET MVC 3 Performance – on par with MVC 2
http://blogs.msdn.com/b/marcinon/archive/2011/01/17/mvc-3-performance.aspx ASP.NET MVC 3 Performance ...