public class Fat
{
public int Data; public Fat(int data)
{
this.Data = data;
}
}public class MainA
{
public static void Main()
{
Fat oFat = new Fat(1);
WeakReference oFatRef = new WeakReference(oFat);
// 从这里开始,Fat对象可以被回收了。
oFat = null;
if (oFatRef.IsAlive)
{
Console.WriteLine(((Fat)oFatRef.Target).Data); // 1
}
else
{//被回收了。 oFat = new Fat(9);
oFatRef.Target = oFat;
Console.WriteLine(((Fat)oFatRef.Target).Data); // 9
}
// 强制回收。
GC.Collect();
Console.WriteLine(oFatRef.IsAlive); // False
Console.ReadLine();
}
}如果你用F11调试结果一定为 9 true
如果你用F5 调试结果一定为1 false
不说GC没有规律,不能控制的吧,现在却出现了这样的现象。由于初学,请高人说说。在线,一定给分。
{
public int Data; public Fat(int data)
{
this.Data = data;
}
}public class MainA
{
public static void Main()
{
Fat oFat = new Fat(1);
WeakReference oFatRef = new WeakReference(oFat);
// 从这里开始,Fat对象可以被回收了。
oFat = null;
if (oFatRef.IsAlive)
{
Console.WriteLine(((Fat)oFatRef.Target).Data); // 1
}
else
{//被回收了。 oFat = new Fat(9);
oFatRef.Target = oFat;
Console.WriteLine(((Fat)oFatRef.Target).Data); // 9
}
// 强制回收。
GC.Collect();
Console.WriteLine(oFatRef.IsAlive); // False
Console.ReadLine();
}
}如果你用F11调试结果一定为 9 true
如果你用F5 调试结果一定为1 false
不说GC没有规律,不能控制的吧,现在却出现了这样的现象。由于初学,请高人说说。在线,一定给分。
机器是2G内存,并且此时只运行这个项目,并且这个项目里只有一个CS文件,并且文件里只有这段代码。您说资源会紧缺吗??再说这与F5与F11产生不同结果,没有关系吧。
WeakReference 请放在unsafe上下文里??? unsafe是什么,在哪里??
您是不是也不相信我说的啊,不信您在“ Fat oFat = new Fat(1);”前设一个断点,再按F5看一个结果,再按F11单步调试,看一下结果,确实象我说的,
如果你用F11调试结果一定为 9 true
如果你用F5 调试结果一定为1 false
没有LZ说的情况
同意,具体不太明白,留名期待高手解答。
oFat = null;
//之间加在GC.Collect();要为全为如果你用F11调试结果一定为 9 true
if (oFatRef.IsAlive)
{
这个结果是可以让人接受的,但如果是DEBug+单步跟踪,又出现了不确定性。这也可以理解,不是说“GC不可能,控制或预测吗。”但是,我在帖子正文的现象,无论如何,我也接受不了。是BUG,还是微软就是这个设计的??或者是“窑变”??基因突变???可能,我还没有到达那种层次,所以不了解。希望此问题有真象大白的一天。
1、资源紧张的时候;2、CPU空闲的时候。
还有,GC会根据情况不定时的回收资源。你用F5去调试程序的时候,因为创建和检测的时间间隔很短,GC还不会将这个对象回收。
但你用F9去调试程序的时候,因为创建和检测的时间间隔很长,GC在这段时间内已经将这个对象回收了!所以你会得到这个结果!