zoukankan      html  css  js  c++  java
  • Finalize什么时候被调用

      Finalize方法在垃圾回收结束时被调用,有五种一下情况会导致开始垃圾回收。

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

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

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

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

      CLR关闭  一个进程正常终止时,CLR就会关闭。在关闭过程中,CLR会认为该进程不存在任何根,因此会调用托管堆中所用对象的Finalize方法。注意,CLR此时不会尝试压缩或释放内存,因为整个进程要终止,将由Windows负责回收进程的所有内存。

      CLR使用一个特殊的、专用的线程来调用Finalize方法。对于前4种事情,如果一个Finalize方法进入了无限循环,这个特殊的线程就会被阻塞,其他Finalize方法就得不到调用。这种请狂况非常糟糕。因为应用程序永远都不会回收由可终结的对象占据的内存------只要应用程序运行,就会一直泄露内存。

  • 相关阅读:
    PHP 5 echo 和 print 语句
    MySQL存储过程-遍历游标的例子
    bzoj2554: Color
    win10 uwp 入门
    win10 uwp 入门
    win10 uwp 自定义控件 SplitViewItem
    win10 uwp 自定义控件 SplitViewItem
    win10 uwp ContentDialog 点确定不关闭
    win10 uwp ContentDialog 点确定不关闭
    win10 uwp smms图床
  • 原文地址:https://www.cnblogs.com/zhangyuanbo12358/p/4467947.html
Copyright © 2011-2022 走看看