随笔 - 119  文章 - 290  trackbacks - 0

博客搬家了哦,请移步
叫我abc

常用链接

留言簿(12)

随笔分类

我的博客

搜索

  •  

积分与排名

  • 积分 - 299138
  • 排名 - 84

最新评论

阅读排行榜

最近写新项目,希望能从内存管理、指针引用的问题上前进一小步,于是在网上爬出云风以前写的一个gc库,姑且称为yfgc吧
粗看了一下接口,很少很正交,使用例子也非常简单。只是我对垃圾收集的原理不是很熟悉,又或者这些接口太接近gc的底层原理,因此我并不是很确定如何运用这些接口。
借用某句著名的话,“源码面前,了无秘密”。为了了解如何运用这些接口,我决定去看看这个不到1000行的gc库的源码,顺便写些东西,毕竟好久没写了。

yfgc的地址
svn地址:http://manualgc.googlecode.com/svn/trunk

撇去weak table和再分配不谈,yfgc有以下接口
 1void gc_init();
 2void gc_exit();
 3
 4void gc_enter();
 5void gc_leave(void *p,);
 6
 7void* gc_malloc(size_t sz,void *parent,void (*finalizer)(void *));
 8
 9void gc_link(void *parent,void *prev,void *now);
10void gc_collect();

先看几个明显易懂的
gc_init,一看就知道是初始化这个gc库的,约摸着底下也就是初始化一些数据结构,分配一些初始内存等等。不过至于做了什么,以后再谈。
gc_exit,一看就知道是在程序退出时析构gc库的,多半是释放内存。如果实现不是很复杂的话,不调用这个函数也不会怎样。
gc_collect,一定是收集垃圾的了,不过现在就深入这个函数的话,一定是本末倒置。因为还不知道内存在哪里分配,就去看内存收集显然是不对的。
gc_malloc,可以肯定,这就是gc库的内存分配接口了。好吧,先看看这个函数,我都有点迫不及待了。

先看一下gc_malloc的三个参数
1.sz,请求分配的内存大小
2.parent,按字面意思是父亲,如果用工厂模式做类比的话,也许会更容易理解些。工厂生产一个对象,就申请一块内存,parent则是工厂本身。
更通用和接近的解释是,parent即持有或者用指针引用这块新内存的那些对象。垃圾收集的概念就是,当一块内存在程序里不被任何对象持有或者指针引用的时候,它就是一块废弃的内存,可以被系统回收。当有任何一个指针引用着这块内存的时候,他就必然不能被回收。
所以,parent这个参数,或者说,新分配的内存必须要比parent那块内存活得更长久,因为parent拥有或者引用着这块新分配的内存。
3.finalizer,析构函数,如果分配内存用来实例化一个类的话,那么这块内存要回收的时候,显然要有一个时机来调用类的析构函数才行。这个回调函数正好可以完成这个任务。

干脆写一个yfgc的源码解析系列好了

posted on 2008-09-10 20:22 LOGOS 阅读(4663) 评论(5)  编辑 收藏 引用 所属分类: 垃圾收集

FeedBack:
# re: 垃圾收集的那点事(A) 2008-09-10 20:37 陈梓瀚(vczh)
语言们用的垃圾收集器都不需要我们显示collect而能够在适当的时候【中断程序】并【开始搜索并收集】。所以这个东西最多算个池。以前我见过一个可以在C++用的垃圾收集器,不用自己collect,他后台自动执行了。

这个gc看起来是让你显式地维护一个图,然后手动对一定不能收集的节点进行标记,然后自己collect。算是【理论上】实现了那个功能。  回复  更多评论
  
# re: 垃圾收集的那点事(A) 2008-09-10 21:10 Don't tell u
研究win2k泄漏代码里面的gc似乎也是一种方法,虽然不像.net java那么彻底,似乎够用,^_^。  回复  更多评论
  
# re: 垃圾收集的那点事(A) 2008-09-10 21:14 LOGOS
@陈梓瀚(vczh)
不错,确实如你所说,这东西强迫人手动去维护依赖关系
如果不这么做,就无法从中得到任何好处

至于手动collect,在我看来和后台自动collect无啥区别  回复  更多评论
  
# re: 垃圾收集的那点事(A) 2008-09-10 22:45 陈梓瀚(vczh)
还是有的,譬如new失败的时候后台可以中断然后collect然后再帮你new。  回复  更多评论
  
# re: 垃圾收集的那点事(A) 2008-09-11 15:49 空明流转
说实话我真觉得不比shared_ptr好多少,RAII才是C++一类货的王道。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理