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#读书笔记——垃圾收集相关知识点【2011-01-20】

     在现实世界中,经常会出现多个线程同时访问托管堆的情况,或者至少会有多个线程同时操作托管堆中分配的对象。当某个线程触发垃圾收集器时,其他线程就不能再访问任何对象(包括各线程自己堆栈上的对象引用...

CLR Via C#读书笔记——StreamWriter中的依赖问题【2011-01-19】

System.IO.FileStream类型允许用户打开文件进行读写操作。为了提高性能,该类型的实现使用了内存缓冲区。只有在内存缓冲区充满时,System.IO.FileStream类型才会将缓冲区的...

CLR Via C#读书笔记——CLR分配内存【2011-01-17】

当应用程序的进程完成初始化后,CLR将保留一块连续的地址空间,这段空间最初并不对任何应用物理内存。该地址空间即为托管堆。托管堆上维护着一个指针,我们称之为NextObjPtr。该指针表示下一个新建对象...

CLR Via C# 第五章(基元类型,引用类型与值类型)(1)——读书笔记

基元类型,引用类型与值类型1.基元类型基元类型:编译器直接支持的概念称作基元类型 简单来说,就是int,char,bool这些基本类型,基元类型会直接映射到Framework类库(FCL)中的类型,...

读书笔记-2java虚拟机的可达性算法与finalize方法

JAVA通过可达性分析算法来确定堆中哪些对象是应该被回收的。 很多人包括我以前在不了解的时候总以为是通过引用计数器来判断某个对象是否应该被回收但是后来想了想包括查阅一些资料发现不是这样的,因为如...

CLR Via C# 第一章(CLR的执行模型)——读书笔记

CLR(common language runtime) 公共语言运行时 是一种可由多个编程语言使用的"运行时" CLR的核心功能(内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所...

CLR Via C# 读书笔记

  • 2010年05月11日 22:59
  • 201KB
  • 下载

《CLR via C#》读书笔记---07 常量和字段

常量只是个占位符 readonly是个伪君子

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

主要讲述task,对应《CLR via C#》中的第26.4小节
  • zlbcdn
  • zlbcdn
  • 2016年11月12日 16:13
  • 354

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

主要讲述timer,对应《CLR via C#》26.6-26.10
  • zlbcdn
  • zlbcdn
  • 2016年11月14日 23:30
  • 234
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CLR Via C#读书笔记——Finalize方法被调用的时机【2011-01-18】
举报原因:
原因补充:

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