c#程序中如何判断一个对象是否被回收了

一个没有再使用的对象,GC会自动回收,那么,我如何知道一个对象被GC回收了呢?也就是说,有时候我可能无法判断某个对象是否在不用的时候是否还存在引用,我想知道GC回收没有,怎么才能知道呢?

indows的任务管理器也可以实时截取“dump”内存快照,同样你可以使用工具诊断这个dump

当然还有其他的工具,比如memprofile

至于代码,我们不从代码上看。因为我们不关心那“一个”代码,我们关心是整个程序的性能和稳定

所以你可以在“性能诊断”--进程内存实时图上,看到明显的new“内存增加”----- 释放"内存减少" 这种锯齿状的图形表现,同时“内存实时图”会用黄色三角箭头告诉你,那是GC强制释放的

继承IDisposable   任何类只要继承该接口,一定会调用此接口,假设你对对象命名或有ID,假如叫张三, 那么一旦被调用,可以输出 
”张三 被释放“ ,或者其他任何形式,如果谁想直到她有没有释放,就查询有没有张三被释放这条记录。。。

快照上可以搜索 Person,搜索不到代表被回收。


class Person
{
    string Name;
    public Person(string s)
    {
        Name = s;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Person b = new Person("张三");
        b = new Person("李四");
        Console.ReadKey();
    }
}
类似于上面这种,有一个Person对象被回收了,有一个没有回收,在快照里面能搜出来

Button_Click方法都执行完了,方法内的临时变量自然要清除掉,因为外面没人用了。

如果你又在外面使用了,自然计数不会0,gc就不清了。

上个帖子已经给你展示过了,如果一个方法里,挂一个事件,而且这个事件还不立刻执行完(比如我把那个帖子里把sender故意存在一个list里,这个list会把计数+1,那么gc认为有人用,所以不清)

同样上个帖子也展示给你了,如果我不故意把sender保存,事件执行完毕,出了事件方法作用域,引用-1,为0
小蜜蜂论坛发帖机 释放

其实就是

 方法A用了+1,事件用了+1,list用了+1,方法A退出-1,事件A退出-1

你看到了,如果没有list,引用是0,如果有list引用是1

可以使用finalize方法,在类中重写后,当对象回收时就会调用finalize()方法了

发布了27 篇原创文章 · 获赞 0 · 访问量 1082

猜你喜欢

转载自blog.csdn.net/netyou/article/details/104274881