[资料] D语言的GC与内存模型

Colorful 2007-08-07
文章太长了,贴个地址,也给自己的Blog赚点人气,哈哈!
http://colorful1982.blog.sohu.com/58810396.html
oldrev 2007-08-07
老实说,我很讨厌GC,因为我讨厌在程序里有不确定的东西
官网文章说GC只会在 new/delete 的时候动作,但是动作的时候会挂起所有的线程,假如一个系统实时性要求高,这恐怕是不能接受的
tomqyp 2007-08-07
你的blog你漂亮
文章也不错,学习

既然操作系统提供了线程和内存管理接口,不如干脆直接提供GC算了,这样语言只用做语言本身的构造和析构就行了。
对了不知道有没有这样的操作系统?
qiezi 2007-08-08
oldrev 写道
老实说,我很讨厌GC,因为我讨厌在程序里有不确定的东西
官网文章说GC只会在 new/delete 的时候动作,但是动作的时候会挂起所有的线程,假如一个系统实时性要求高,这恐怕是不能接受的

gc可以暂停的
qiezi 2007-08-08
1、_d_newclass在phobos/internal/gc/gc.d里面。

2、“这样的内存分配方式使得分配对象的速度相当快,几乎可以与在线程堆栈中分配对象一样快”
这个很难说,malloc的实现一般也是从操作系统分配一大块,然后每次调用时找一块出来,GC干了同样的事,不过是换了个管理者,在这方面不一定有什么优势。

3、关于同步索引块的描述,我感觉不太准确。同步这块的代码我在phobos里看的不是很明白,大致感觉应该是phobos/internal/monitor.c这个文件里吧,它是在每个对象里保存一个指针,如果对象的monitor成员为空,就创建一个临界区对象。就是不知道synchronized什么时候调用了这些函数,是没公开的那部分代码?

4、“基于代的垃圾收集器” 这个有相关代码的解读吗?我以前看过一部分,似乎就是个标记/整理,没看到这部分,GC后来倒是升级过一次,没再看过。

5、标题我感觉不是很恰当,内存模型这个词的范围比较大,不光是内存管理这部分。比如刘未鹏这篇blog: http://blog.csdn.net/pongba/archive/2007/06/20/1659952.aspx 就提到更多东西。
Colorful 2007-08-08
oldrev 写道
老实说,我很讨厌GC,因为我讨厌在程序里有不确定的东西
官网文章说GC只会在 new/delete 的时候动作,但是动作的时候会挂起所有的线程,假如一个系统实时性要求高,这恐怕是不能接受的


这个线程的优先级比较高,如果不这样,没办法挂起其他线程,执行垃圾回收。

GC对于实时性确实有一些影响,但是也出现了几个用于实时的GC。
比如.NET的MicroFramework和机器人平台。
貌似J2ME平台也有实时性的产品。

大容量的CPU缓存对于GC有着相当的好处。
Colorful 2007-08-08
qiezi 写道
1、_d_newclass在phobos/internal/gc/gc.d里面。

2、“这样的内存分配方式使得分配对象的速度相当快,几乎可以与在线程堆栈中分配对象一样快”
这个很难说,malloc的实现一般也是从操作系统分配一大块,然后每次调用时找一块出来,GC干了同样的事,不过是换了个管理者,在这方面不一定有什么优势。

3、关于同步索引块的描述,我感觉不太准确。同步这块的代码我在phobos里看的不是很明白,大致感觉应该是phobos/internal/monitor.c这个文件里吧,它是在每个对象里保存一个指针,如果对象的monitor成员为空,就创建一个临界区对象。就是不知道synchronized什么时候调用了这些函数,是没公开的那部分代码?

4、“基于代的垃圾收集器” 这个有相关代码的解读吗?我以前看过一部分,似乎就是个标记/整理,没看到这部分,GC后来倒是升级过一次,没再看过。

5、标题我感觉不是很恰当,内存模型这个词的范围比较大,不光是内存管理这部分。比如刘未鹏这篇blog: http://blog.csdn.net/pongba/archive/2007/06/20/1659952.aspx 就提到更多东西。


逐个回复吧。
1. 感谢qiezi指出_d_newclass的实现,我仔细看了一下,有些细节上的差别,比如COM对象的分配,额外开销的大小(因为目前只有32bit实现,所以是2*4+1),设置一下终结器(内部采用Finalizer,规范里叫做析构函数),晚上有时间修正一下。
2.我们可以比对一下它们的实现,呵呵。
C语言运行时在堆中为对象分配内存时首先需要遍历一个链表数据结构。一旦找到一个足够大的内存块,该内存块就会被拆分,同时链表相应节点上的指针也会适当调整以保证相关对象完整性。
而对于GC Heap来说,分配对象就仅仅在指针上增加一个数值以满足对象大小。这比操作链表要快很多。工作虽然都一样,但是内容却改变了。
qiezi 2007-08-08
phobos里实现的GC和stl相似,都会为一些小对象使用不同的池,并不是简单地加一个值,GC Heap也不是一整块内存,当然实现成一整块也是可能的,不过phobos里面似乎并不是这么实现的。从我阅读的代码来看,它也是用链表的。
Colorful 2007-08-08
3.这个可能是我没说清楚。
每个Object都有一个隐藏的monitor指针,即我说的同步块索引,这个指针指向的是Struct Monitor。这个结构有两部分组成,一个委托数组和同步锁对象。Win下是临界区对象,Linux下是pthread_mutex_t对象;
当不需要同步时,它不会初始化。而委托数组则负责在需要同步时,回调初始化同步锁的方法。
synchronized关键字的实现应该在编译器里
achun 2007-08-08
各位讨论的.........
我看着就觉得晕.
各位既然做了如此深入的研究.
可否指点一下在不考虑代码繁琐的情况下.
如何写代码,才能让GC在释放内存的时候尽量的快.
或者说,我们如何手动的用一些代码.改进GC在释放内存的时候尽量少的付出挂起开支?
又或者.D的这几个基础库,对比一下GC的挂起开支?
Global site tag (gtag.js) - Google Analytics