【C#】浅谈C#中垃圾回收机制

这篇具有很好参考价值的文章主要介绍了【C#】浅谈C#中垃圾回收机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C#】浅谈C#中垃圾回收机制,c#,java,jvm


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


浅谈C#中垃圾回收机制



C# 中的垃圾回收 (Garbage Collection, GC) 是一种自动的内存管理机制,它帮助开发者释放不再使用的内存资源:

1. 为什么需要垃圾回收?

  • 手动管理内存可能会导致内存泄漏(未释放但不再使用的内存)或者重复释放同一块内存,从而引发错误。
  • 通过自动化的垃圾回收,可以减少这种错误,并确保有效利用内存资源。

2. 工作原理:

  • .NET 的内存分为几个不同的世代,分别是:世代 0、世代 1 和世代 2。
  • 新对象默认创建在世代 0。
  • 当垃圾回收器运行时,它首先检查世代 0 中的对象。那些不再被引用的对象会被回收,仍然存活的对象则进入世代 1。
  • 世代 1 和世代 2 的收集频率较低,因为较老的对象(即存在时间较长的对象)通常有更长的生命周期。

3. 如何工作:

  • 垃圾回收器查找根引用(如全局变量、静态变量、活动的本地变量等)开始,然后遍历所有可访问的对象。
  • 一旦所有活动的或可访问的对象都被标记后,所有其他的对象都被视为垃圾,因此可以被安全地回收。

4. 垃圾回收的触发时机:

  • 当世代 0 的对象超过了一个阈值时。
  • 当调用 GC.Collect() 时。
  • 当系统内存不足时。

5. 不足和问题:

  • GC 是有代价的。当垃圾回收器运行时,所有其他的线程可能会被暂停。
  • 开发者无法明确知道何时对象会被回收。

6. 如何优化:

  • 尽量减少大对象的创建,因为这可能会导致频繁的垃圾收集。
  • 如果知道对象生命周期,可以使用结构(structs)而不是类(classes),因为结构在栈上分配,而不是在堆上。
  • 有意识地设置长时间存活的对象为 null,以帮助垃圾回收器更早地回收它们。

7. 其他:

  • FinalizersDispose 方法允许对象在被回收前执行一些清理工作,例如释放非托管资源。
  • 强烈建议使用 using 语句来确保 IDisposable 对象在使用后被正确地清理。

8. 非托管资源的处理:

  • 虽然垃圾回收器会自动管理托管的内存资源,但对于非托管资源(例如文件句柄、数据库连接等),需要手动释放。
  • 为此,可以实现 IDisposable 接口,并在 Dispose 方法中释放这些资源。

总结,垃圾回收是.NET框架提供的一个强大工具,用于帮助开发者自动管理内存。但是,了解其工作原理和如何优化内存使用仍然是十分重要的。


9. 举例说明

下面通过一个简单的例子来说明 C# 中垃圾回收的概念:

9.1. 对象的创建和回收

public class Person
{
    public string Name { get; set; }

    // 析构函数(Finalizer)
    ~Person()
    {
        Console.WriteLine($"{Name} 被回收了!");
    }
}

public static void Main(string[] args)
{
    Person person1 = new Person() { Name = "张三" };
    Person person2 = new Person() { Name = "李四" };

    person1 = null; // 去除对张三的引用
    person2 = null; // 去除对李四的引用

    GC.Collect(); // 强制执行垃圾回收

    Console.ReadLine();
}

在这个示例中,我们创建了两个 Person 对象,分别命名为张三和李四。当我们将 person1person2 设置为 null 之后,这两个对象实际上已经失去了对它们的所有引用,所以它们可以被视为垃圾。通过调用 GC.Collect() 我们强制执行了垃圾回收,所以我们会在控制台上看到两条消息,表示这两个对象已经被回收。


9.2 IDisposable 的使用

public class DatabaseConnection : IDisposable
{
    private bool disposed = false;

    public void Open()
    {
        Console.WriteLine("数据库连接已打开");
    }

    public void Close()
    {
        Console.WriteLine("数据库连接已关闭");
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                Close(); // 释放托管资源
            }

            // 释放非托管资源(如文件句柄、网络套接字等)

            disposed = true;
        }
    }

    ~DatabaseConnection()
    {
        Dispose(false);
    }
}

public static void Main(string[] args)
{
    using (DatabaseConnection dbConnection = new DatabaseConnection())
    {
        dbConnection.Open();
        // 进行一些数据库操作
    } // 在 using 语句结束时,Dispose 方法会被自动调用

    Console.ReadLine();
}

在这个示例中,我们创建了一个模拟的 DatabaseConnection 类,它实现了 IDisposable 接口。我们在 Dispose 方法中关闭数据库连接并释放相关资源。使用 using 语句可以确保在对象不再使用时,Dispose 方法会被自动调用,从而释放资源。文章来源地址https://www.toymoban.com/news/detail-739145.html


到了这里,关于【C#】浅谈C#中垃圾回收机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:

    2024年01月16日
    浏览(75)
  • 【JVM】垃圾回收机制

     哈喽,哈喽,大家好~ 我是你们的老朋友: 保护小周ღ    今天给大家带来的是  JVM (Java 虚拟机) 的垃圾回收机制,回收是指回收什么?  如何确定要回收的内存: 引用计数,可达性分析,如何释放空间 : 标记清除,复制算法,标记整理,分代回收 ,一起来看看叭~ 本期

    2024年02月09日
    浏览(33)
  • JVM及垃圾回收机制

    类加载器负责将.class文件加载到JVM中。主要分为三种层次:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。它们按层次关系加载类,保证类的隔离性和重用性。 运行时数据区包括方法区、堆、栈、本地方法栈和程序计数器。堆用于存放对象实例,方法区保存类信息和

    2024年02月12日
    浏览(34)
  • JVM基础(3)——JVM垃圾回收机制

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月25日
    浏览(34)
  • JVM:垃圾回收机制(GC)

    引用计数算法:         在对象中添加一个引用计数器,当每有一个地方引用它时,计数器值加一。当引用失效时,计数器值就减一。当一个对象的计数器为零时,表示该对象没有被任何其他对象引用,因此可以被释放。 优点 :是可以及时回收垃圾对象,避免内存泄漏,且

    2024年01月19日
    浏览(36)
  • JVM中的垃圾回收机制

    java相较于c、c++语言的优势之一是自带垃圾回收器,垃圾回收是指 不定时 去堆内存中清理 不可达 对象。不可达的对象并不会 马上 就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,程序员唯一能做的就是通过调用System.gc 方法来建议执行垃圾收集

    2024年02月16日
    浏览(38)
  • JVM G1垃圾回收机制介绍

    G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而其

    2024年02月13日
    浏览(22)
  • 【JVM】垃圾回收机制详解(GC)

    可以看jvm详解之后,再来理解这篇文章更好 堆和方法区,主要发生在堆中,然后主要发生在堆的伊甸园区(Eden)。 Java中的垃圾回收是根据 可达性分析算法(Reachability Analysis) 和 引用计数算法 来判断对象是否存活的。 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:

    2024年02月13日
    浏览(44)
  • 【JVM】| 垃圾回收机制 | 文末送书

    Java的垃圾回收机制是自动的,不需要程序员手动进行内存管理。当Java应用程序创建对象时,它们存储在堆内存中。当对象不再被引用时,垃圾回收器会自动标记这些对象为垃圾,并将它们从堆内存中清除,释放空间。 如果要操作对象,必须通过引用来进行。如果一个对象没

    2024年02月13日
    浏览(29)
  • 深入学习JVM —— GC垃圾回收机制

            前面荔枝已经梳理了有关JVM的体系结构和类加载机制,也详细地介绍了JVM在类加载时的双亲委派模型,而在这篇文章中荔枝将会比较详细地梳理有关JVM学习的另一大重点——GC垃圾回收机制的相关知识,重点了解的比如对象可达性的判断、四种回收算法、分代回收

    2024年02月14日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包