要搞清楚什么是弱引用,我们需要先知道强引用是什么。强引用并不是什么深奥的概念,其实我们平时所使用的.Net引用就是强引用。例如:
从这一点来看,弱引用就完全不一样了——即使某个对象被弱引用所指向,该对象仍然会被垃圾回收。也就是说,弱引用不会影响对象的生命周期。
System.WeakReference类是.net为我们提供的一个弱引用的实现,可以这么用:
如果在上例的第一行代码之后第二行代码之前,CLR发生了一次垃圾回收,那么可以基本断定那个Cat对象实例已经不存在了,此时weakReference.Target是null。
首先,WeakReference自身也实现了析构函数。也就是说,它即使不再被使用了,也不会被立即回收,而是会在内存里赖着多活一会(可能会经历不止一次的垃圾回收)。
改进措施很简单——使用完位图对象后,不是直接丢弃,而是用一个弱引用指向它。待下次访问位图对象时,就可以先通过弱引用判断位图对象是否还在内存中,如果还在则直接使用,否则重新创建。
有时,对于某种类型,我们需要知道当前程序中存在有多少对象实例,以及存在的都是哪些实例,以便于我们进行一些性能分析。这时,我们就可以使用到弱引用了。例如下面的代码:
GetInstanceCount方法可以得到内存中A类型的实例个数。另外,还可以通过instances集合来检查内存中的A类型实例都有哪些。在调试内存泄露问题的时候,这些信息都可以派上用场。
联系客服