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. oracle rac 日志体系结构!

    告警日志集群节点集群件告警日志:$GRID_HOME/log/<hostname>/alert<hostname>.log数据库实例的告警日志:$DIAG_DESTINATIO ...

  2. MapReduce从输入文件到Mapper处理之间的过程

    1.MapReduce代码入口 FileInputFormat.setInputPaths(job, new Path(input)); //设置MapReduce输入格式 job.waitForCo ...

  3. java的文件流:字节流(FileInputStream、FileOutputStream)和字符流(FileReader、FileWriter)。

    java的输入输出建立在4个抽象类的基础上:InputStream.OutputStream.Reader.Writer.InputSream和OutputStream被设计成字节流类,而Reader ...

  4. 解决spawn-fcgi child exited with: 1

    spawn-fcgi -d /data/web/ad/ -f /data/web/ad/code.py -a -P /data/openresty_81/nginx/pid/ad.pid 出错的时候请 ...

  5. dwr与ssh框架整合教程

    (1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开 发人员开发包含AJ ...

  6. 使用HTTP协下载文件

    通过发送HTTP请求,下载文件 头文件: #ifndef __HTTP__ #define __HTTP__ #include <stdio.h> #include <stdlib. ...

  7. 动态链接库(dll) __declspec(dllimport) __declspec(dllexport)

    一. __declspec(dllexport) Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .lib ...

  8. 二模09day1解题报告

    T1.词编码(word) 给出一些原长为n的01串经过变化后的串求原串.原串的特点是:各个1的位置号和%(n+1)==0 变法(只取其一): 改一个0为1 删一个 加一个 不变. 其中2优先考虑位置靠 ...

  9. 二模10day2解题报告

    T1.最多因子数(divisors) 给出范围l,r求其中约数和最大的最小整数. 非常深井冰的题目:如果特判加暴力的话分数低的可怜 AC做法要用到分解质因数和线性筛(这俩好写),然而,一个一个枚举还是 ...

  10. SVN与TortoiseSVN实战:从入门到精通

    SVN,版本控制程序,是支撑项目开发的基础工具. 在团队开发中,不管是程序员还是美工.测试等人员,都会用到SVN,通常会把SVN视为源代码管理工具,但对于SVN更准确的理解是: “帮助参与项目人员的管 ...