110,534
社区成员
发帖
与我相关
我的任务
分享
person p1 = new person();
p1.Name = "Tam";
WeakReference wkr = new WeakReference(p1);
p1 = null;
GC.Collect(); // 强制进行垃圾回收
object wP1 = wkr.Target;
if (wP1 != null)
{
Console.WriteLine(((person)wP1).Name);
}
else
{
Console.WriteLine("对象已被回收");
}
Console.ReadKey();
}
}
class person
{
public string Name { get; set; }
}
class GarbageCollect
{
public static void ForceCollect()
{
object obj = new object();
WeakReference wr=new WeakReference(obj);
obj=null;
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
object wP1 = wr.Target;
if (wP1 != null)
{
Console.WriteLine("obj is still alive");
}
else
{
Console.WriteLine("gc is done");
}
}
}
了解了GC的概念,知道了generation,big object heap等,貌似对这个问题也木有帮助是吧?在CLR这个level还要反编译ML出来说明问题,你们也太C了!既然MS划好了圈圈,安心在里面玩揍是了。托管的世界多美好啊!
[quote=引用 11 楼 sp1234 的回复:] 如果你看到一篇文章上说“DEBUG下就不会在当前方法完毕前释放对象,而RELEASE下就会在当前方法执行完毕钱释放对象”,那么你看我上面对代码的修改就能知道了,这篇文章写错了!
如果你看到一篇文章上说“DEBUG下就不会在当前方法完毕前释放对象,而RELEASE下就会在当前方法执行完毕钱释放对象”,那么你看我上面对代码的修改就能知道了,这篇文章写错了!
我尝试在Release模式下运行,但是结果还是和Debug一样。用多线程的话是结果是被回收了。这是GC回收机制的不确定性,还是因为线程的问题?
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
你使用多线程看到了回收的结果,不要理解错了。那是因为方法中代码改变了,会影响到 jit 计算的生命周期,而不是因为需要等待 GC.Collect 执行。你可以试验,仅仅把测试是否回收的代码移到另一个方法里就能改变结果。我尝试在Release模式下运行,但是结果还是和Debug一样。用多线程的话是结果是被回收了。这是GC回收机制的不确定性,还是因为线程的问题?