gpt4 book ai didi

d - GC.collect() 对象可达性

转载 作者:行者123 更新时间:2023-12-04 04:13:19 25 4
gpt4 key购买 nike

没有更多引用的对象不能立即使用 GC.collect() 进行垃圾回收,但是可以通过中间调用,例如new、writeln 或 Thread.sleep 将使未引用的对象可以通过 GC.collect() 访问。

import std.stdio;
import core.thread;
import core.memory;

class C
{
string m_str;
this(string s) {this.m_str = s;}
~this() { writeln("Destructor: ",this.m_str); }
}

void main()
{
{
C c1 = new C("c1");
}
{
C c2 = new C("c2");
}
//writeln("Adding this writeln means c2 gets destructed at first GC.collect.");
//Thread.sleep( 1 ); // Similarly this call means c2 gets destructed at first GC.collect.
//int x=0; for (int i=0; i<1000_000_000;++i) x+=2*i; // Takes time, but does not make c2 get destructed at first GC.collect.
GC.collect();
writeln("Running second round GC.collect");
GC.collect();
writeln("Exiting...");
}

上面的代码返回:

Destructor: c1
Running second round GC.collect
Destructor: c2
Exiting...

任何人都可以解释垃圾收集期间对象的这种可达性吗?

最佳答案

我不熟悉D的垃圾收集的细节,但一般的技术是从所有“根指针”开始找出哪些对象是存活的。当事物被编译为机器代码时,这意味着从函数调用堆栈和 CPU 寄存器开始。

上面的代码可能会编译为:

$r0 = new C("c1")
$r0 = new C("c2")
GC.collect()
writeln("Running second round GC.collect")
GC.collect()
writeln("Exiting...")

当第一个 GC.collect() 时,不再有对第一个对象的引用(因为 $r0 被覆盖)。即使没有使用第二个对象,$r0 中仍然有一个指向它的指针,因此 GC 保守地假设它是可访问的。请注意,在变量 c2 超出范围后,编译器可能会清除 $r0,但这会使代码运行速度变慢。

当第一个 writeln 调用执行时,它可能在内部使用寄存器 $r0 ,因此它清除了对第二个对象的引用。这就是为什么在第二次调用 GC.collect() 后第二个对象被回收。

关于d - GC.collect() 对象可达性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5761160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com