我下的tango-0.99.1-bin-win32-dmd.1.021为啥运行不了垃圾收集?
ahadf
2007-10-18
竟然才发现。
|
|
ahadf
2007-10-18
没说清楚,再补充一下。
tango的gc表现跟标准库gc很不一样。如果内存分配没有达到一定的上限,就不会运行垃圾收集,哪怕程序结束也是一样。手动调用GC.collect()来收集一堆小的无用对象的话,有时候第一个对象也收集不到,程序结束也是如此。 而标准库的gc就该干什么干什么,程序结束时正确释放所有对象。为什么tango的gc表现这么奇怪呢?请各位指教一下。 |
|
redsea
2007-10-18
我用这个代码强制 tango gc, 有效(linux).
大概 tango 将栈中一部分没有用到的地方, 也当作有效栈进行扫描. void zeroStack() { volatile int[4096] ia; ia[] = 0; } void doGC() { zeroStack(); tango.core.Memory.GC.collect(); } |
|
ahadf
2007-10-19
我的机器windows :
class A { int[1024] a; this(){Stdout("this()\n"); ~this(){Stdout("~this()\n"); } void foo() { A a=new A; } 1.用tango,少于444K无法启动垃圾回收,直到程序结束也不行 void main() { int i=0; while(++i<100) { foo(); } } 2.循环中分配对象,第一个对象无法回收,直到程序结束也不行 void main() { int i=0; while(++i<5) { foo(); GC.collect(); } } 用标准gc的话,表现就很正常。请指教一下。 |
|
tomqyp
2007-10-19
ahadf 写道 第一个对象无法回收,直到程序结束也不行 好像是最后一个对象没有回收 |
|
ahadf
2007-10-19
为啥没人回答呢?难道我的问题太trivial了?汗。。。
|
|
redsea
2007-10-20
我的程序中, 如果用我的方式, 所有的对象都释放.
做法是, main 里面除了调用工作函数, 接着就调用 dogc. 如果在main 里面直接写工作代码, 或者直接写 dogc 的代码行, 都不能保证对象被释放. 这个并不是大问题, 用 gc 的程序中, 非内存资源不应该让 gc 释放的时候才释放; 程序退出的时候, 所有 gc 没有释放的内存, 操作系统会释放, gc 少做点工作还可以速度快一些, 写linux 下面过滤程序的时候, 进程启动, 关闭速度还是有影响的. ahadf 写道 为啥没人回答呢?难道我的问题太trivial了?汗。。。
|
|
ahadf
2007-10-20
我也知道。不过我就是奇怪为什么tango的gc表现得那么“不标准”,或者说这种设计的初衷是什么(这么明显的问题应该不是bug吧)。
|
|
oldrev
2007-10-21
设计的初衷只能去问作者了,不过退出时不回收内存也不是什么大不了的事,SGI STL 也这么干,进程结束了自然内存就都释放了。
|
|
tomqyp
2007-10-21
我觉得如果不把这个视为BUG的话,至少应该在相关文档中说明。
假如要释放的不是一块内存,甚至不是本地资源,例如在一个C/S结构的系统中,遇到这种情况服务端可能永远不知道这些资源可以释放了。 |