我下的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结构的系统中,遇到这种情况服务端可能永远不知道这些资源可以释放了。
Global site tag (gtag.js) - Google Analytics