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没有规律,不能控制的吧,现在却出现了这样的现象。由于初学,请高人说说。在线,一定给分。

解决方案 »

  1.   

    @资源只有需要的时候才回收,不是时时回收的
    机器是2G内存,并且此时只运行这个项目,并且这个项目里只有一个CS文件,并且文件里只有这段代码。您说资源会紧缺吗??再说这与F5与F11产生不同结果,没有关系吧。
      

  2.   

    顺便web项目,如果调试的话,他等待的时间也会被强制设置为20秒,不管你webconfig里如何设置
      

  3.   

    @freeboy827不可能的,不信给你把程序发过去。对了,你在任何一行设一个断点,这样就会出效果了。
      

  4.   

    WeakReference 请放在unsafe上下文里.在调试状态下,生成的IL和发布状态是不同的,为了支持断点监视,调试时系统自己在对象作用域结束的地方添加一个可达根. 这样在作用域内GC就不会回收这个对象了.所以不管F5还是 F11 都是调试状态,所以都是1,False
      

  5.   

    @syeerzy(快乐永远*先天下之乐而乐*后天下之忧而忧*) 
    WeakReference 请放在unsafe上下文里???   unsafe是什么,在哪里??
    您是不是也不相信我说的啊,不信您在“ Fat oFat = new Fat(1);”前设一个断点,再按F5看一个结果,再按F11单步调试,看一下结果,确实象我说的,
    如果你用F11调试结果一定为 9 true
    如果你用F5 调试结果一定为1 false
      

  6.   

    大家 不信可以,去下载我录的录像邮箱是我的,[email protected] password 5i5i5i5i在收件箱中,您一看标题就知道了。在符件中,不有病毒。人格担保。
      

  7.   

    unsafe是非安全代码 可以用指正
      

  8.   

    我这总是1 FALSE
    没有LZ说的情况
      

  9.   

    大家 不信可以,去下载我录的录像邮箱是我的,[email protected] password 5i5i5i5i在收件箱中,您一看标题就知道了。在符件中,不有病毒。人格担保。
      

  10.   

    @wsxqaz(原来可以改昵称) 
    同意,具体不太明白,留名期待高手解答。
      

  11.   

    不光是“Jinglecat(晓风残月 >> 问题需简洁,错误要详细)”{这位热心的大侠,上榜了,恭喜,而且是第一}说的那样我在
    oFat = null;
    //之间加在GC.Collect();要为全为如果你用F11调试结果一定为 9 true
            if (oFatRef.IsAlive)
            {
    这个结果是可以让人接受的,但如果是DEBug+单步跟踪,又出现了不确定性。这也可以理解,不是说“GC不可能,控制或预测吗。”但是,我在帖子正文的现象,无论如何,我也接受不了。是BUG,还是微软就是这个设计的??或者是“窑变”??基因突变???可能,我还没有到达那种层次,所以不了解。希望此问题有真象大白的一天。
      

  12.   

    这个问题根本不是问题,GC一般在以下两种情况下会回收资源:
    1、资源紧张的时候;2、CPU空闲的时候。
    还有,GC会根据情况不定时的回收资源。你用F5去调试程序的时候,因为创建和检测的时间间隔很短,GC还不会将这个对象回收。
    但你用F9去调试程序的时候,因为创建和检测的时间间隔很长,GC在这段时间内已经将这个对象回收了!所以你会得到这个结果!
      

  13.   

    @wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴)GC的原理,确实象您说的,但如果您说我遇到的这个现象是“创建和检测的时间间隔”的长短,我不同意,您在连按F11的情况下与直接按F5的情况结果还是不同的,难道就差那几秒秒(大于3秒,小)于5秒
      

  14.   

    GC在CPU比较空闲的情况下回收的时间间隔对我们来说其实很短,不会5秒还没回收资源的。
      

  15.   

    谢谢您,wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴) ,这么晚还回贴。我打算此帖子再留一天,再结,想看看大家是怎么说的。
      

  16.   

    不知道楼主在瞎搞个什么劲。出现这两种结果都符合GC的规范,根本不存在什么问题。GC的特定行为由其实现算法决定,我不知道微软内部采用的什么具体实现方法会造成F5和F11的行为不一样,但是这都不违反GC规范,也不妨碍使用。去揣测GC的特定行为毫无意义,算法一改行为就不一样了,server runtime和wrokstation runtime就不一样,升级一个.net版本也可能造成GC行为改变,这没什么好大惊小怪的。
      

  17.   

    在另外一个帖子的回的,C#与C++不同,你不应该随意假设一个对象的生命周期,因为GC与程序是同步运行的,我想你拿java测试应该也会出现同样的效果,而C++是绝对不可能会的。