垃圾回收机制可以说是运行时的核心。垃圾回收是指回收所有不再被引用对象所占用的内存。即处理的是引用对象、只负责回收其堆上的内存。而也就是说一直被引用的对象可以阻止垃圾回收器对自己的操作
垃圾回收采用的是mark and compact算法。要识别的是对象的根引用,根引用来自静态变量、局部变量、参数实例、CPU寄存器以及(f-reachable对象)的引用。基于这个列表,垃圾回收可以遍历所有根引用所标识的树形结构、并递归所有根引用所指向的对象。由此可以访问所有可达对象。
回收不是枚举所有可达对象,而是通过压缩相邻可达对象,这样会覆盖不可达对象的内存。
在进行垃圾回收的期间需要保持状态一致,即所有托管线程的暂停。为避免执行关键代码期间进行垃圾回收,可在关键代码前使用System.GC对象的Collect方法,但是本方法只能尽量保证执行关键代码时不进行垃圾回收,除非关键代码会消耗大量内存,一般不会出问题。
垃圾回收机制定义“代”的概念。(丐帮六袋长老)不过这个代最多两代。也就是说垃圾回收并不是所有对象内存都在同一周期内完成回收。相对于长期存在对象,新建对象需要回收的概率会更大。这个长期存在的可能就是二代,而新创建的为零代。两者之间零代优先回收!!!
平时我们使用的变量大多为强引用,即能阻止垃圾回收器的行为。而弱引用不能阻止一个对象执行垃圾回收,却能维持一个引用,也就代表只要垃圾回收不清除对象,,既可以重用。
弱引用为了维护一些创建成本较大、维护起来开销较大的对象。相当于内存缓存。
下面举个弱引用的小例子:
<span style="font-size:18px;"> private WeakReference Data;
public FileStream GetData()
{
//Target获取当前对象的引用。将弱引用类型赋给强引用类型防止垃圾回收运行清除弱引用。
//强引用会阻止垃圾回收清除对象,所以必须先赋值而不是先检查Target是不是为null
FileStream data = (FileStream)Data.Target;
//为避免在执行检查null和访问数据期间进行垃圾回收
//指派了弱引用变量Data,为了检查是否垃圾回收,先判断是否为null
if (data != null)
return data;
else
Data.Target = data;
return data;
}
</span>