断点调试看看是不是死循环导致的.
采用WeakReference
我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的。我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET中提供了WeakReference来实现。弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应旦搏用程模做祥序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。弱引用使用起来很简单,看下面的代码:
Object obj = new Object()
WeakReference wref = new WeakReference( obj )
obj = null
第一行代码新建了一个新的对象,这里叫它对象A,obj是对对象A的强引用。接着第二行代码胡型新建了一个弱引用对象,参数就是对象A的强引用,第三行代码释放掉对对象A的强引用。这时如果GC进行回收,对象A就会被回收。
怎样在取得对象A的强引用呢?很简单,请看代码2:
Object obj2 = wref.Target
if( obj2 != null )
{
// 做你想做的事吧。
}
else
{
// 对象已经被回收,如果要用必须新建一个。
}
只要显示的将弱引用的Target属性附值就会得到弱引用所代表对象的一个强引用。不过在使用对象之前要对其可用性进行检查,因为它可能已经被回收了。如 果你得到的是null(VB.NET下为Nothing),表明对象已经被回收,不能再用了,需要重新分配一个。如果不是null,就可以放心大胆的用 了。
这样写肯定不行啊,.NET的异常机笑饥制一般碰兄返只用于.NET体系之中,很多系统级别的crash .NET无法拦截的,而且就算能拦截此时应用已经无法运行了,你说你的catch能执行吗?最好的做法是自己设置一个阀值,检测当数据足够大时进行释放,而不是依靠catch。而且尘和try catch这个东西正常情况下时不影响性能的,一旦执行catch会额外消耗性能。所以不要依赖try catch去帮你容错。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)