CLR Via C#读书笔记——Finalize方法被调用的时机【2011-01-18】

原创 2011年01月18日 19:30:00

下列五种事件会启动垃圾收集,收集结束时会调用Finalize方法:

 

1.第0代对象充满:第0代对象充满时开始执行垃圾收集。该事件是目前导致Finalize方法被调用的最常见的一种方式,因为事件通常在应用程序代码运行过程中分配新对象的时候发生。

 

2.代码显示地调用System.GC的静态方法Collect:代码可以显式地请求CLR执行垃圾收集。虽然Microsoft强烈建议不要这样做,但某些时候强制执行垃圾收集对应用程序来说还是有意义的。

 

3.Windows报告内存不足:CLR内部使用了Win32的CreateMemoryResourceNotification和QueryMemoryResourceNotification函数来监视系统的整体内存。如果Windows报告内存不足,CLR将强制执行垃圾收集,尝试释放死亡对象以减小进程工作集的大小

 

4.CLR卸载应用程序域:当一个应用程序域被卸载时,CLR会认为该应用程序域中不存在任何根,因此会对应用程序域中所有代的对象执行垃圾收集。

 

5.CLR被关闭:当一个进程正常终止时(与外部关闭相反,例如,通过任务管理器关闭),CLR就会关闭。在关闭过程中,CLR会认为该进程中不存在任何根,因此会调用托管堆中所有对象上的Finalize方法。注意,此处CLR不准备压缩或者释放内存,因为整个进程正在被终止,Windows将回收进程的所有内存。

 

 

CLR使用一个特殊的专用线程来调用Finalize方法。对于前面列出的前4种事件来说,如果有Finalize方法进入了一个无限循环,那么这个特殊的线程将被阻塞,其他的Finalize方法将得不到调用。这种情况非常糟糕,因为应用程序将不能够再回收其他终结对象占用的内存——只要应用程序还在运行,它就存在泄漏内存的可能。

 

对第5种事件来说,每个Finalize方法会有大约2秒钟的运行时间。如果一个Finalize方法没有在2秒钟内返回,那么CLR将中断该进程——其他的Finalize方法将得不到调用。另外,如果调用所有对象的Finalize方法超过了40秒钟,那么CLR也会中断该进程。(这些为超时设定的值Microsoft在未来可能会在将来改变它们)

《CLR via C#》读书笔记-异步编程(一)

复习APM编程方式
  • zlbcdn
  • zlbcdn
  • 2016年11月23日 21:06
  • 660

CLR via C# 读书笔记(八)静态类和线程安全

1。当静态类被访问的时候,CLR会调用类的静态构造器(类型构造器),创建静态类的类型对象,CLR希望确保每个应用程序域内只执行一次类型构造器,为了做到这一点,在调用类型构造器时,CLR会为静态类加一个...
  • commandos
  • commandos
  • 2008年03月31日 17:35
  • 6123

《CLR via C#》学习笔记【1】

一、CLR的执行模块1.1 将源代码编译成托管模块 非托管C/C++可对系统进行低级控制,按自己的想法管理内存、VB可以快速生成UI应用程序,并控制COM对象和数据库。 公共语言运行时(Commo...
  • just0kk
  • just0kk
  • 2016年05月05日 20:11
  • 1373

CLR Via C#读书笔记——垃圾收集(Timer)【2011-01-18】

using System; using System.Threading; namespace TimerInstanceGCCollection { class Program ...
  • jaychouliyu
  • jaychouliyu
  • 2011年01月18日 14:57
  • 531

《CLR via C#》读书笔记-.NET多线程(六)

主要讲述timer,对应《CLR via C#》26.6-26.10
  • zlbcdn
  • zlbcdn
  • 2016年11月14日 23:30
  • 290

《CLR Via C#》第四版英文原版PDF下载基于.net4.5和Windows8

CLR via C# 4th Edition.pdf 电子书下载,《CLR Via C#》第四版英文原版PDF下载基于.net4.5和Windows8 下载《CLR via C# 4th Edi...
  • u010323872
  • u010323872
  • 2013年06月09日 12:27
  • 4397

《CLR via C#:框架设计》读书笔记 - CLR

《CLR via C#:框架设计》读书笔记 - CLR
  • a2324268086
  • a2324268086
  • 2016年04月21日 17:14
  • 463

《CLR via C#》学习笔记【2】

二、生成、打包、部署和管理应用程序及类型 2.1 .NET Framework部署目标 Windows多年来一直因为不稳定和过于复杂而口碑不佳。存在所谓”DLL hell“、安装的复杂性等繁琐...
  • just0kk
  • just0kk
  • 2016年05月07日 20:20
  • 570

CLR Via C# 第四章 类型基础——读书笔记

1.类型转换 在以下示例代码中,第一部分能通过编译,因为方法PromoteEmoloyee期待一个Object,而Manage正是Object一个派生类,所以能进入该方法, 进入方法后,o...
  • qq_32884717
  • qq_32884717
  • 2016年05月19日 14:58
  • 220

《CLR via C#》读书笔记-.NET多线程(二)

Thread类的基础知识,《CLR via C#》中第25章的25.6-25.10
  • zlbcdn
  • zlbcdn
  • 2016年10月29日 16:58
  • 638
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CLR Via C#读书笔记——Finalize方法被调用的时机【2011-01-18】
举报原因:
原因补充:

(最多只允许输入30个字)