C#垃圾回收器GC、析构函数(Finalize 方法)和Dispose

这篇具有很好参考价值的文章主要介绍了C#垃圾回收器GC、析构函数(Finalize 方法)和Dispose。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、垃圾回收器GC

GC(Garbage Collection)是.NET中的垃圾回收器。以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象,通过识别它们是否被引用,来确定哪些对象是已经死亡的,哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。GC的开销通常很大,而且它的运行具有不确定性,微软的编程规范里是强烈建议你不要显式调用GC。但你的代码中还是可以使用.NET Framework中GC的某些方法进行手动回收,前提是必须要深刻理解GC的回收原理,否则手动调用GC在特定场景下很容易干扰到GC的正常回收甚至引入不可预知的错误。

在.NET Framework中,创建对象所用内存在托管堆中分配,垃圾管理器负责管理。在堆中可分配的内存,被CLR以块划分,以代[Gemeration]命名,初始分为256k、2M和10M三个代(0、1和2)。并且CLR可以动态调整代的大小。在堆创建的每一个对象都有一个Generation的属性。.NET Framework中约定,最近创建的对象,其Generation其值为0。创建时间越远代数越高。

强制垃圾回收用函数GC.Collect()GC.Collect(int32)参考为Generation,代码如下,

using System; 
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
 
namespace ConsoleApplication
{
    public class TestObject 
    {
      public int Value = 100;
      public string Key = "cjavapy";
    }
    class Program
    {
        static void Main(string[] args)
        {
            TestObject obj  =   new  TestObject();
            int  generation  =   0 ;
             
            generation  =  GC.GetGeneration(obj);
            Console.WriteLine(0);
            Console.WriteLine( " TotalMemory:{0} " , GC.GetTotalMemory( false ));
            Console.WriteLine( " MaxGeneration:{0} " , GC.MaxGeneration);
            Console.WriteLine( " Value:{0},Key:{1} " , obj.Value, obj.Key.Length);
            Console.WriteLine( " Generation:{0} " , generation);
            Console.WriteLine();
             
            try
            {
                new FileStream(@"F:\cavapy.avi", FileMode.Open);
            }
            catch  (Exception e) { }
             
            for  ( int  j  =   1 ; j  <   6 ; j ++ )
            {
                generation  =  GC.GetGeneration(obj);
                Console.WriteLine(j.ToString());
                Console.WriteLine( " TotalMemory:{0} " , GC.GetTotalMemory( false ));
                Console.WriteLine( " MaxGeneration:{0} " , GC.MaxGeneration);
                Console.WriteLine( " Value:{0},Key:{1} " , obj.Value, obj.Key.Length);
                Console.WriteLine( " Generation:{0} " , generation);
                Console.WriteLine();
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            Console.ReadKey();  
        }
    }
}

 

2、析构函数(Finalize 方法)

析构函数(Finalize 方法)用来释放非托管资源,由GC来调用执行回收,来保证非托管资源可以被释放。Object.Finalize()方法是无法重载的,编译器是根据类的析构函数来自动生成Object.Finalize()方法的。对于包含非托管资源的类,可以将释放非托管资源的代码放在析构函数。

例如,

public class FinalizeClass
{
    ~FinalizeClass()
    {
       //在这里,清理非托管资源
    }
}

 

注意:不能在析构函数中释放托管资源,因为析构函数是由垃圾回收器调用的,可能在析构函数调用之前,类包含的托管资源已经被回收了,从而导致无法预知的结果。

3、Dispose

.NET Framework中非托管理资源的释放,除了可以使用析构函数(Finalize 方法),还可以通过实现IDisposable接口,代码执行完成后通过调用Dispose()方法来释放非托管资源。与析构函数的区别主要是,Dispose()方法需要程序员手动调用。

调用方式如下,

//方式1:显示接口调用
SomeType st1=new SomeType();
//执行操作
st1.Dispose();
 
//方式2:using()语法,运行到using范围外自动执行Dispose方法
using (var st2 = new SomeType())
{
    //执行操作
}

 文章来源地址https://www.toymoban.com/news/detail-631495.html

到了这里,关于C#垃圾回收器GC、析构函数(Finalize 方法)和Dispose的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 垃圾回收器

    垃圾回收器

    垃圾回收器就是垃圾回收的实践者,随着JDK的发展,垃圾回收器也在不断的更迭,在不同的场合下使用不同的垃圾回收器,这也是JVM调优的一部分。 按线程可分为单线程(串行)垃圾回收器和多线程(并行)垃圾回收器。 按工作模式可分为独占式和并发式垃圾回收器。 按工作的区

    2024年02月11日
    浏览(10)
  • 常见的垃圾回收器(上)

    常见的垃圾回收器(上)

    常见的垃圾回收器(下) Serial垃圾回收器 + SerialOld垃圾回收器 Serial是一种单线程串行回收年轻代的垃圾回收器 回收年代和算法 年轻代:复制算法 老年代:标记-整理算法 优点 单CPU处理器下吞吐量非常出色 缺点 多CPU下吞吐量不如其他垃圾回收器,堆如果偏大会让用户线程处

    2024年04月14日
    浏览(9)
  • JVM之垃圾回收器

    JVM之垃圾回收器

    垃圾回收常见面试题: 如何判断对象是否死亡。 简单的介绍一下强引用、软引用、弱引用、虚引用。虚引用与软引用和弱引用的区别、使用软引用能带来的好处 如何判断一个常量是废弃常量 如何判断一个类是无用的类 垃圾收集有哪些算法,各自的特点? HotSpot 为什么要分

    2024年02月14日
    浏览(12)
  • 【JVM】13. 垃圾回收器

    2023年05月29日
    浏览(9)
  • JVM的组件、自动垃圾回收的工作原理、分代垃圾回收过程、可用的垃圾回收器类型

    JVM的组件、自动垃圾回收的工作原理、分代垃圾回收过程、可用的垃圾回收器类型

    https://www.processon.com/diagraming/64c8aa11c07d99075d934311 https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 年轻代是所有新对象被分配和老化的地方。当年轻代填满时,这会导致minor garbage collection,minor gc会回收掉很多的游离对象。游离的年轻代很快就被收集起来。一些幸存的

    2024年02月14日
    浏览(32)
  • 深入解析CMS垃圾回收器

    本文已收录至GitHub,推荐阅读 👉 Java随想录 微信公众号:Java随想录 原创不易,注重版权。转载请注明原作者和原文链接 目录 CMS简介 运作过程 初始标记 并发标记 并发预处理 可取消的并发预处理 重新标记 并发清除 CMS的缺陷 处理器资源敏感 无法处理“浮动垃圾” 内存碎

    2024年02月11日
    浏览(13)
  • 深入解析G1垃圾回收器

    深入解析G1垃圾回收器

    本文已收录至GitHub,推荐阅读 👉 Java随想录 微信公众号:Java随想录 原创不易,注重版权。转载请注明原作者和原文链接 上篇文章我们聊了CMS,这篇就来好好唠唠G1。 CMS和G1可以说是一对欢喜冤家,面试问你CMS,总喜欢把G1拿进来进行比较。 G1在JDK7中加入JVM,在JDK9中成为了

    2024年02月11日
    浏览(8)
  • JVM垃圾回收器G1详解

    JVM垃圾回收器G1详解

    在我们应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,我们需要不断地尝试对GC进行优化。G1(Garbage-First)垃圾回收器是在Java7 update4之后引入的一个新的垃圾回收器,是当今收集器技术发

    2024年02月09日
    浏览(11)
  • JVM常见的垃圾回收器(详细)

    JVM常见的垃圾回收器(详细)

    1、Young为年轻代出发的垃圾回收器。 2、Old为老触发的垃圾回收器。 3、连线代表的是垃圾回收器的组合。CMS 和Serial Old连线代表CMS一旦不行了,Serial Old上场。 1、什么是STW? STW是Stop-The-World缩写: 是在垃圾回收算法执⾏过程当中,将JVM内存冻结丶应用程序停顿的⼀种状态。

    2024年02月08日
    浏览(14)
  • 说一下 JVM 有哪些垃圾回收器?

    说一下 JVM 有哪些垃圾回收器?

    如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。下图展示了7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、ParNew、Parallel Scavenge,回收老年代的收集器包括SerialOld、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器

    2024年02月22日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包