.Net 垃圾回收机制

根包括:

* 全局/静态指针。为了使我们的对象不被垃圾回收掉的一种方式是将它们的引用保存在静态变量中。
* 栈上的指针。我们不想丢掉应用程序中需要执行的线程里的东西。
* CPU寄存器指针。托管堆中哪些被CPU寄存器直接指向的内存地址上的东西必须得保留。

Mark-Compact 标记压缩算法

托管代码/非托管代码

弱引用(Weak References

弱引用(weak reference)可以保持对对象的引用,同时允许垃圾收集器在它认为适当的垃圾收集时间释放对象,回收内存。假设有一个对象创建相对便宜,但需耗费大量的内存,如果希望保持这个对象,在应用程序需要使用它,但也希望能够告诉垃圾收集器,在必要时把内存收回。

总的来说,我们能够提升GC表现的方式有:

1. 清理工作。不要让资源一直打开!尽可能地保证关闭所有打开的连接,清除所有非托管的资源。当使用非托管对象时,初始化工作尽量完些,清理工作要尽量及时点。

2. 不要过度地引用。需要时才使用引用对象,记住,如果你的对象是活动着的,所有被它引用的对象都不会被垃圾回收。当我们想清理一些类所引用的事物,可以通过将这些引用设置为null来移除它们。我喜欢采用的一种方式是将未使用的引用指向一个轻量级的NullObject来避免产生null引用的异常。在GC进行垃圾回收时,更少的引用将减少映射处理的压力。

3. 少使用finalizer。Finalizer在垃圾回收时是非常昂贵的资源,我们应该只在必要时使用。如果我们使用IDisposable来代替finalizer会更高效些,因为我们的对象能够直接被GC回收而不是在第二次回收时进行。

4. 尽量保持对象和它们的子对象在一块儿。GC在复制大块内存数据来放到一起时是很容易的,而复制堆中的碎片是很费劲的,所以当我们声明一个包含许多其他对象的对象时,我们应该在初始化时尽量让他们在一块儿。

5. 最后,使用静态方法来保持对象的轻便也是可行的。

http://www.cnblogs.com/mirobright/archive/2009/11/21/1607773.html

原文地址:https://www.cnblogs.com/xiao-hei/p/3917781.html