在.Net中,资源回收主要是指内存管理和非托管资源的释放。分别提供了两种主要的方式进行处理:

  1. 垃圾回收(GC)
  2. 确认性资源释放(DRD)

官网相关文档的链接:https://learn.microsoft.com/zh-cn/dotnet/standard/managed-code

垃圾回收(Garbage Collection)

垃圾回收是.NET运行时自动处理内存管理的一种机制。它负责检测不再被应用程序使用的对象,并释放这些对象占用的内存

特点:

  • 自动运行,不需要开发者显性调用
  • 当内存不足时触发
  • 释放托管内存(即通过.NET内村分配的内存)
  • 不保证立即释放内存,而是根据内存压力情况周期性地进行

垃圾回收的局限性:

  • 无法处理非托管资源,如文件句柄、数据库链接、图形设备接口(GDI)对象等
  • 可能会导致应用程序出现短暂的暂停(GC暂停)

确定性资源释放

对于非托管资源,.NET提供了确定性的资源释放机制,通常通过IDisposable接口实现。

IDsposable接口:

  • 当一个对象实现了IDsposable接口,意味着它持有需要手动释放的资源
  • 实现IDsposable的对象必须重写Dispose方法来清理非托管缓存

使用using语句:

  • 使用using语句来自动释放实现IDsposable的对象所持有的资源
  • using语句确保即使在发生异常的情况下,Dispose方法也会被调用

实例中,StreamReader实现了IDsposable接口。通过使用using语句,当StreamReader对象超出作用域时,Dispose方法会被自动调用,从而释放文件句柄。

using System;
using System.IO; class Program
{
static void Main()
{
// 使用 using 语句来自动释放 StreamReader 的资源
using (StreamReader reader = new StreamReader("example.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
} // 如果没有使用 using 语句,需要手动调用 Dispose
// StreamReader reader = new StreamReader("example.txt");
// try
// {
// string line;
// while ((line = reader.ReadLine()) != null)
// {
// Console.WriteLine(line);
// }
// }
// finally
// {
// reader.Dispose();
// }
}
}

.Net内存管理释放的两种方式的更多相关文章

  1. Linux进程分配内存的两种方式--brk() 和mmap()

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  2. 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  3. 进程分配内存的两种方式--brk() 和mmap()(不设计共享内存)(转)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  4. 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别

    1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...

  5. Linux 服务管理两种方式service和systemctl

    Linux 服务管理两种方式service和systemctl 1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本 ...

  6. Spring管理事物两种方式

    Spring管理事物两种方式 1. 编程式事物管理(在开发中不经常使用) 使用步骤 1. 配置数据库事物管理 DataSourceTransactionManager <!--配置事物管理器-- ...

  7. 大数据学习day33----spark13-----1.两种方式管理偏移量并将偏移量写入redis 2. MySQL事务的测试 3.利用MySQL事务实现数据统计的ExactlyOnce(sql语句中出现相同key时如何进行累加(此处时出现相同的单词))4 将数据写入kafka

    1.两种方式管理偏移量并将偏移量写入redis (1)第一种:rdd的形式 一般是使用这种直连的方式,但其缺点是没法调用一些更加高级的api,如窗口操作.如果想更加精确的控制偏移量,就使用这种方式 代 ...

  8. Spring中事务管理的两种方式

    spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务 ...

  9. 传递引用类型参数的两种方式(转自 MSDN)

    引用类型的变量不直接包含其数据:它包含的是对其数据的引用.当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值(更改属性的值),但是无法更改引用本身的值:也就是说,不能使用相同的引 ...

  10. [操作系统知识储备,进程相关概念,开启进程的两种方式、 进程Queue介绍]

    [操作系统知识储备,进程相关概念,开启进程的两种方式.进程Queue介绍] 操作系统知识回顾 为什么要有操作系统. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作 ...

随机推荐

  1. 剑指Offer-47.求1+2+3+...+n(C++/Java)

    题目: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 分析: 利用短路与来判断n是否大于0,从而实现递 ...

  2. The sultion of P4959

    problem & blog 首先我们看到 \(x,y\) 有可能为负数,所以我们先把它旋转到第一象限. 然后我们发现如果 \(x_a \ge x_b\) 且 \(y_a \ge y_b\) ...

  3. ABC326

    上次说我的写法low的人的AT号在这里!!( 我又来提供 low 算法了. 从 D 开始. T4 我们把 \(\text{A}\) 看成 \(1\),把 \(\text{B}\) 看成 \(2\),把 ...

  4. error pulling image configuration: Get https://eastasia.data.mcr.microsoft.com -- net/http: TLS handshake timeout

    error pulling image configuration: Get https://eastasia.data.mcr.microsoft.com/b29889755b1f4e46b6b44 ...

  5. 网络问题排查必备利器:Pingmesh

    背景 当今的数字化世界离不开无处不在的网络连接.无论是日常生活中的社交媒体.电子商务,还是企业级应用程序和云服务,我们对网络的依赖程度越来越高.然而,网络的可靠性和性能往往是一个复杂的问题,尤其是在具 ...

  6. Django路由层、视图层及模板层

    Django路由层 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表; 你就是以这种方式告诉Django,对于客户端发来的某个UR ...

  7. 使用vscode写Markdown并且导出为pdf(干货)

    目录 序言 下载vscode 安装插件 markdown语法 导出为pdf 序言 大家在学习过程中都会有记笔记的好习惯(美观的笔记当然是上上选),于是,Markdown就是一个不错的选择,待会也会附上 ...

  8. springboot项目配置多数据源

    springboot项目配置多数据源 //关键:mybatis文件的目录需要区分开来 sqlSessionFactoryBean.setMapperLocations(new PathMatching ...

  9. 【已结束】阿珏Blog三周年特别纪念活动

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` [已结束]阿珏Blog三周年特别纪念活动 日期:2019- ...

  10. 基于Python和TensorFlow实现BERT模型应用

    本文分享自华为云社区<使用Python实现深度学习模型:BERT模型教程>,作者: Echo_Wish. BERT(Bidirectional Encoder Representation ...