最近写新项目,希望能从内存管理、指针引用的问题上前进一小步,于是在网上爬出云风以前写的一个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 阅读(4734)
评论(5) 编辑 收藏 引用 所属分类:
垃圾收集