【赠书活动】浅谈C#中垃圾回收机制

news2024/12/23 19:18:18

请添加图片描述


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


浅谈C#中垃圾回收机制


目录

  • 浅谈C#中垃圾回收机制
    • 1. 为什么需要垃圾回收?
    • 2. 工作原理:
    • 3. 如何工作:
    • 4. 垃圾回收的触发时机:
    • 5. 不足和问题:
    • 6. **如何优化:**
    • 7. **其他:**
    • 8. **非托管资源的处理:**
  • 9. 举例说明
    • 9.1. 对象的创建和回收
    • 9.2 IDisposable 的使用
  • 本期好书推荐 《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 方法会被自动调用,从而释放资源。


本期好书推荐 《C# 从入门到精通》


编辑推荐

“软件开发视频大讲堂” 丛书是清华社计算机专业基础类零售图书畅销品牌之一。
(1)2008—2023年,丛书累计修订7次,销售400万册,深受广大程序员喜爱。
(2)4本荣获“全行业优畅销书”奖,1本荣获清华社“专业畅销书”一等奖,多数品种在全国计算机零售图书排行榜排行中名列前茅。
(3)实用、易懂、资源丰富,被数百所高校选为专业课教材。

在这里插入图片描述


图书特点

  1. 学通C#只需要4步:基础知识→核心技术→高级应用→项目实战,符合认知规律。
  2. 157集同步教学微课+强化实战训练+在线答疑,夯实基础,精准,有效,速练,适合自学。
  3. 233个应用实例+123个编程训练+90个综合练习+2个项目案例,学习1小时,训练10小时,从入门到项目上线,真正成为C#高手。
  4. 根据图书首页说明,扫描书中二维码,打开明日科技账号注册页面,填写注册信息后将自动获取C#开发资源库一年(自注册之日起)的VIP使用权限。
    (1)技术资源库:348个技术要点,系统、全面,随时随地学习。
    (2)技巧资源库:629个开发技巧,快速扫除盲区,掌握更多实战技巧,精准避坑。
    (3)实例资源库:1583个应用实例,含大量热点实例和关键实例,巩固编程技能。
    (4)项目资源库:38个实战项目,快速积累项目经验,总有一个你找工作会用到。
    (5)源码资源库:1619项源代码详细分析,多读源码,快速成长。
    (6)视频资源库:668集学习视频,边看视频边学习,提升更快。
    (7)面试资源库:C#企业面试真题,合理职业规划,快速就业。
  5. 在线解答,高效学习。
    (1)关注清大文森学堂公众号,可获取本书的源代码、PPT课件、视频等资源。
    (2)关注清大文森学堂公众号,可加入本书的学习交流群,参加图书直播答疑。

内容简介

《C#从入门到精通(第7版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用C#进行Windows应用程序开发方方面面的技术。全书分为4篇,共25章,包括初识C#及其开发环境、C#程序基本结构、变量与常量、表达式与运算符、字符与字符串、流程控制语句、数组和集合、面向对象编程、Windows窗体应用程序设计、Windows窗体应用程序常用控件、Windows窗体应用程序高级控件、数据访问技术、LINQ数据访问技术、DataGridView数据控件、程序调试与异常处理、面向对象编程进阶、文件及数据流技术、GDI+图形图像技术、Windows打印技术、网络编程技术、线程的使用、注册表技术等内容,以及贪吃蛇、五子棋、全民飞机大战、AI图像识别软件、ERP管理系统等实战项目。本书所有知识都结合具体实例进行介绍,涉及的程序代码给出了详细的注释,可以使读者轻松领会C#应用程序开发的精髓,以快速提高开发技能。


作者简介

明日科技,全称是吉林省明日科技有限公司,是一家专业从事软件开发、教育培训以及软件开发教育资源整合的高科技公司,其编写的教材非常注重选取软件开发中的必需、常用内容,同时也很注重内容的易学、方便性以及相关知识的拓展性,深受读者喜爱。其教材多次荣获“全行业优秀畅销品种”“全国高校出版社优秀畅销书”等奖项,多个品种长期位居同类图书销售排行榜的前列。
.
购买链接
京东链接:https://item.jd.com/13791921.html
当当链接:http://product.dangdang.com/29594971.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1066831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识链表(7.25)

前面我们学习了顺序表,但顺序表其实存在一些问题 1. 中间/头部的插入删除,时间复杂度为O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗(尤其是异地扩容)。 3. 增容一般是呈2倍的增长&am…

大语言模型之十六-基于LongLoRA的长文本上下文微调Llama-2

增加LLM上下文长度可以提升大语言模型在一些任务上的表现,这包括多轮长对话、长文本摘要、视觉-语言Transformer模型的高分辨4k模型的理解力以及代码生成、图像以及音频生成等。 对长上下文场景,在解码阶段,缓存先前token的Key和Value&#…

数据结构(2-5~2-8)

2-5编写算法&#xff0c;在单链表中查找第一值为x的结点&#xff0c;并输出其前驱和后继的存储位置 #include<stdio.h> #include<stdlib.h>typedef int DataType; struct Node {DataType data; struct Node* next; }; typedef struct Node *PNode; …

【高并发优化手段】基于Springboot项目

文章目录 一、概述二、服务器配置1. 选择合适的机器2. 配置服务器参数&#xff08;1&#xff09;TCP网络层参数如何配置 &#xff08;2&#xff09;文件系统参数仅根据硬件配置&#xff0c;估算机器的最大性能修改配置 &#xff08;3&#xff09;内存参数 三、Tomcat配置1. 调整…

11.2 基本电路和基本分析方法

一、基本电路 电路类型电路名称特点和典型功能指标参数或功能描述方法基本放大电路共射放大 ∣ A ˙ ∣ |\dot A| ∣A˙∣大&#xff1b;适用于小信号电压放大 A ˙ u \dot A_u A˙u​、 R i R_i Ri​、 R o R_o Ro​、 f L f_L fL​、 f H f_H fH​、 f b w f_{bw} fbw​共集…

echarts的bug,在series里写tooltip,不起作用,要在全局先写tooltip:{}才起作用,如果在series里写的不起作用就写到全局里

echarts的bug&#xff0c;在series里写tooltip&#xff0c;不起作用&#xff0c;要在全局先写tooltip&#xff1a;{show:true}才起作用&#xff0c;如果在series里写的不起作用就写到全局里 series里写tooltip不起作用&#xff0c;鼠标悬浮在echarts图表上时不显示提示 你需要…

(一)Log4Net - 介绍

0、相关概念 Log4j 几乎每个大型应用程序都包含自己的日志记录或跟踪 API。根据这一规则&#xff0c;E.U. SEMPER &#x1f339;项目决定编写自己的跟踪 API。那是在 1996 年初。经过无数次的增强、几个化身和大量的工作&#xff0c;API 已经发展成为 log4j —— 一个流行的 Ja…

LabVIEW利用以太网开发智能液位检测仪

LabVIEW利用以太网开发智能液位检测仪 目前&#xff0c;工业以太网接口在国内外的发展已经达到了相当深入的程度&#xff0c;特别是在自动化控制和工业控制领域有着非常广泛的应用。在工业生产过程中&#xff0c;钢厂的连铸机是前后的连接环节&#xff0c;其中钢水从大钢包进入…

ToBeWritten之改进威胁猎杀:自动化关键角色与成功沟通经验

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

uni-app--》基于小程序开发的电商平台项目实战(四)

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

八大排序详解(默认升序)

一、直接插入排序 直接插入排序&#xff1a;直接插入排序就是像打扑克牌一样&#xff0c;每张牌依次与前面的牌比较&#xff0c;遇到比自己大的就将大的牌挪到后面&#xff0c;遇到比自己小的就把自己放在它后面(如果自己最小就放在第一位)&#xff0c;所有牌排一遍后就完成了排…

PX4仿真添加world模型文件,并使用yolov8进行跟踪

前言 目的:我们是为了在无人机仿真中使用一个汽车模型,然后让仿真的无人机能够识别到这个汽车模型。所以我们需要在无人机仿真的环境中添加汽车模型。 无人机仿真中我们默认使用的empty.world文件,所以只需要将我们需要的模型添加到一起写进这个empty.world文件中去就可以…

电脑多开微信教程,可以多开n个

下载地址 链接&#xff1a;https://pan.baidu.com/s/1uWXIhfTZ-aD0A4RBxrI8bg?pwdy2s5 提取码&#xff1a;y2s5 效果如图&#xff1a;

地下水数值模拟软件如何选择?GMS、Visual MODFLOW Flex、FEFLOW、MODFLOW

强调模块化教学&#xff0c;分为前期数据收集与处理&#xff1b;三维地质结构建模&#xff1b;地下水流动模型构建&#xff1b;地下水溶质运移模型构建和反应性溶质运移构建5个模块&#xff1b;采用全流程模式将地下水数值模拟软件GMS的操作进行详细剖析和案例联系。不仅使学员…

Android中的RxJava入门及常用操作符

文章目录 1.定义2.作用3.特点4.使用4.1创建被观察者&#xff08;Observable&#xff09;4.2创建观察者&#xff08;Observer&#xff09;4.3订阅&#xff08;Subscribe&#xff09;4.4Dispose 5.操作符5.1操作符类型5.2just操作符5.2链式调用5.3 fromArray操作符5.4 fromIterab…

服务器文件备份

服务器上&#xff0c;做好跟应用程序有关的文件备份&#xff08;一般备份到远程的盘符&#xff09;&#xff0c;有助于当服务器发生硬件等故障时&#xff0c;可以对系统进行进行快速恢复。 下面以Windows服务器为例&#xff0c;记录如何做文件的备份操作。 具体操作如下&#…

贷款行业,教你如何直接沟通客户

信贷行业拓展业务的人力与时间成本非常高。如是做小微贷款业务的公司可能在寻找贷款客户、筛选客户资质这两项初始工作上花掉超过50%的精力。 并且由于行业特殊性&#xff0c;金融信贷受政策的影响比较大&#xff0c;没法形成固定的推广渠道&#xff0c;线上营销不好做&#x…

什么是站内搜索引擎?如何在网站中加入站内搜索功能?

在当今数字时代&#xff0c;用户体验对于网站的成功起着至关重要的作用。提升用户体验和改善整体网站性能的一种方法是引入站内搜索引擎。站内搜索引擎是一种强大的工具&#xff0c;它的功能类似于Google或Bing等流行搜索引擎&#xff0c;但它专注于实施自己网站上的内容。用户…

工业路由器项目应用(4g+5g两种工业路由器项目介绍)

引言&#xff1a; 随着工业智能化的不断发展&#xff0c;工业路由器在各个领域的应用越来越广泛。本文将介绍两个工业路由器项目的应用案例&#xff0c;一个是使用SR500 4g工业路由器&#xff0c;另一个是使用SR800 5g工业路由器。 详情&#xff1a;https://www.key-iot.com/i…