Finalize方法在垃圾回收结束时被调用,下面有5种事件会导致开始垃圾回收

1.第0代已满    第0代已满,垃圾回收会自动开始。该事件是目前导致Finalize方法被调用的最常见的一种方式,因为虽然应用程序的运行并分配新对象,这个事件会自然而然的发生。

2.代码显示调用System.GC的静态方法Collect   代码可以显示的请求CLR执行垃圾回收。虽然Microsoft强烈建议不要这样做,但某些时候还是必要的。

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

4.CLR卸载AppDomain   一个AppDomain被卸载时,CLR认为该AppDomain中不再存在任何根,因此会对所有代码的对象执行垃圾回收。

5.CLR关闭  一个进程正常终止时 ,CLR就会关闭。在关闭过程中,CLR会认为该进程中不存在任何根,因此会调用托管堆中所有对象的Finalize方法。

CLR使用了一个特殊的,专用的线程来调用Finalize方法。对于前4中事件,如果一个Finalize方法进入一个无线循环,这个特殊的线程会被阻塞,其他Finalize方法得不到调用。因此应用程序永远都不能回收由终结器的对象占用的的内存 ,只要应用程序运行,就会一直泄露内存。

对于第5中事件。每个Finalize大约都有2秒的时间返回,如果在2秒内没有返回,CLR就直接杀死该进程。不会调用更多的Finalize方法。另外如果调用所有对象的Finalize方法的时间超过40秒,CLR也会杀死进程。

以本章前面给出的GCBeep类型为例。如果一个GCBeep对象由于前三种事件被终结。就会在终结过程中构建一个新的GCBeep。这是合理的,因为应用程序继续运行,后面将发生更多的垃圾回收,但是,如果GCBeep对象由于第4种和第5种事件终结,就不能再构造新的GCBeep对象,否则在appdomain卸载或CLR关闭过程中,还会多余的创建对象。创建这些多余的对象后,CLR将继续调用他们的Finalize方法,被迫做大量无用功。

为了阻止构造新的GCBeep对象,GCBeep的Finalize方法调用了AppDomain的IsFinalizingForUnload方法,同时查询了System.Environment的HasShutdownStarted属性,如果对象的Finalize方法时由于AppDomain卸载而被调用,IsFinalizingForUnload方法将返回true。如果对象的Finalize方法时由于对象的终止而被调用,HasShutdownStarted属性返回true.

第五节:什么导致Finalize方法被调用的更多相关文章

  1. iOS NSURLConnection 和 dispatch_async 错误的使用方法,导致回调方法无法调用

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{ NSMutableURLRequest ...

  2. Java finalize方法使用

    <JAVA编程思想>: Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. ( ...

  3. [java]final关键字、finally关键字与finalize()方法

    final关键字: final关键字通常指的是“无法改变的”,使用“无法改变”这样修饰可能出于两个原因:设计或者效率. final可以修饰变量.方法和类. 一.final变量 一个既是static又是 ...

  4. centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课

    centos  lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress  安装phpmyadmin  定时备份mysql两种方法  第二十五节 ...

  5. 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联

    第九节: 利用RemoteScheduler实现Sheduler的远程控制   一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...

  6. 五、java基础-关键字this_static_super_abstract_final,finalize()方法finally语句块

    1.关键字this 含义:this 是一个引用类型,代表当前对象,引用类型里面必然保存内存地址,在堆中的每个对象中存储,保存内存地址指向自身. 用法: 1)this可以用在成员方法中,里面保存内存地址 ...

  7. JVM GC-----4、finalize()方法

    finalize()方法是Object类中定义的protect方法.每一个类都可以重写该方法,给出自己的实现.当类在被回收期间,这个方法就可能会被调用到. 为什么说可能?这是由于finalize()的 ...

  8. 第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

    第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行 ...

  9. centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课

    centos  Linux系统日常管理2  tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...

随机推荐

  1. keypress

    onKeyUp="keypress2(this,140)" onblur="keypress2(this,140)"<span>你还可以输入140个 ...

  2. Android——KEYCODE列表

    电话键 键名 描述 键值   KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME 按键Home 3 KEYCODE_MENU 菜单键 82 KE ...

  3. NEERC 2013, Eastern subregional contest

    I. The old Padawan Time limit: 0.5 secondMemory limit: 64 MB Yoda: Use the Force. Yes. Now, the ston ...

  4. Hibernate和JDBC、EJB比较

    参考:http://m.blog.csdn.net/article/details?id=7228061 一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App S ...

  5. 【LeetCode】17. Letter Combinations of a Phone Number

    题目: 思路:设置两个List,一个存储当前层,一个存储最终层 public class Solution { public List<String> letterCombinations ...

  6. hdu 3336【Count the string】(KMP)

    一道字符串匹配的题目,仅仅借此题练习一下KMP 因为这道题目就是要求用从头开始的n个字符串去匹配原来的字符串,很明显与KMP中求next的过程很相似,所以只要把能够从头开始匹配一定个数的字符串的个数加 ...

  7. 智能指针(一):STL auto_ptr实现原理

    智能指针实际上是一个类(class),里面封装了一个指针.它的用处是啥呢? 指针与内存 说到指针自然涉及到内存.我们如果是在堆栈(stack)中分配了内存,用完后由系统去负责释放.如果是自定义类型,就 ...

  8. badge ionic tab

    我需要在tab上动态显示 badge badge="badges.carts" badge-style="badge-assertive" 将这段代码 放在了 ...

  9. css的border效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Asp.net默认配置下,Session莫名丢失的原因及解决

    Asp.net默认配置下,Session莫名丢失的原因及解决 我们平时写的asp.net程序,里面要用到Session来保存一些跨页面的数据.但是Session会经常无故丢失,上网查查,也没找到原因. ...