.net内存何时回收?
垃圾收集器周期性的执行内存清理工作,一般在以下情况出现时垃圾收集器将会启动:
(1)内存不足溢出时,更确切地应该说是第 0代对象充满时。
(2)调用 GC.Collect 方法强制执行垃圾回收。
(3)Windows报告内存不足时,CLR 将强制执行垃圾回收。
(4)CLR 卸载AppDomain 时,GC将对所有代龄的对象执行垃圾回收。
(5)其他情况,例如物理内存不足,超出短期存活代的内存段门限,运行主机拒绝分配存等等。
GC 将着手进行内存清理,
当内存释放之前GC会首先检查终止化链表中是否有记录来决定在释放内存之前执行非托管资源的清理工作,然后才执行内存释放。同时,微软强烈建议不要通过 GC.Collect方法来强制执行垃圾收集,因为那会妨碍 GC本身的工作方式,通过Collect会使对象代龄不断提升,扰乱应用程序的内存使用。只有在明确知道有大量对象停止引用时,才考虑使用 GC.Collect 方法来调用收集器。
GC在性能优化:
垃圾收集器将托管堆中的对象分为三代,分别为:0、1和2。在 CLR 初始化时,会选择为三代设置不同的阙值容量,一般分配为:第0 代大约 256KB,第1 代2MB,第2 代10MB,显然,容量越大效率越低,而 GC 收集器会自动调节其阙值容量来提升执行效率,第0 代对象的回收效率肯定是最高的。
随着对象的不断创建,垃圾收集再次启动时则只会检查 0代对象,并回收 0代垃圾对象。而1 代对象由于未达到预定的 1 代容量阙值,则不会进行垃圾回收操作,从而有效的提高了垃圾收集的效率,这就是代龄机制在垃圾回收中的性能优化作用。