.NET 内存管理两种有效的资源释放方式

张裕  金牌会员 | 2024-10-14 09:24:41 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 564|帖子 564|积分 1692

前言

嗨,各人好!今天我们要聊一聊 .NET 中的内存管理。你知道吗?虽然 .NET 有一个很好的垃圾采取体系来主动清理不再使用的对象,但在某些情况下,我们还需要自己动手来释放一些特殊的资源,比如打开的文件或数据库连接。假如不这样做,可能会导致程序运行不畅甚至崩溃。在本文里,将先容两种简单有效的方式来管理这些资源:使用 using 语句和显式调用 Dispose 方法。这两种方式可以我们更有效地控制资源的生命周期,制止内存泄漏等问题,确保应用程序的结实性。不管是刚入门的小白照旧技术大牛,希望你能从这篇文章中学有用的知识和技巧,让我们的程序运行的更稳、更靠谱。正文

在 .NET 中内存管理主要依赖于垃圾采取机制,主要是指内存管理和非托管资源的释放。但是,有时候我们可能需要更细粒度地控制某些资源的释放。两种主要的方式举行处置惩罚

  • 垃圾采取(GC)
  • 确认性资源释放(DRD)
官网相关文档https://learn.microsoft.com/zh-cn/dotnet/standard/managed-code垃圾采取(Garbage Collection)

垃圾采取是 .NET 中一个非常紧张的主动内存管理机制。它资助我们主动清理不再使用的对象,并释放这些对象占用的内存,制止了手动管理内存的繁琐的工作,使我们能够更加专注于编写业务逻辑。1、为什么需要垃圾采取?


  • 制止内存泄漏:垃圾采取主动检测不再使用的对象,并释放它们占用的内存空间。
  • 简化代码:无需手动释放内存,淘汰了代码中的错误和负担。
2、垃圾采取有哪些特点?


  • 主动运行,不需要开发者显性调用
  • 当内存不足时触发
  • 释放托管内存(即通过.NET内村分配的内存)
  • 不保证立即释放内存,而是根据内存压力情况周期性地举行
3、垃圾采取有什么范围性?


  • 无法处置惩罚非托管资源,如文件句柄、数据库链接、图形设备接口(GDI)对象等
  • 可能会导致应用程序出现短暂的停息(GC停息)
4、垃圾采取需要留意什么?


  • 尽量制止大对象堆:大对象会直接分配到大对象堆,可能会导致垃圾采取器更频繁地工作。
  • 适时调用 GC.Collect():虽然大多数情况下不需要手动触发垃圾采取,但在某些特殊场景下,如长时间运行的应用程序,可以考虑适时调用 GC.Collect() 来资助采取内存。
确定性资源释放

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

.NET 提供了 IDisposable 接口来资助管理非托管资源(例如文件句柄、数据库连接等)。
使用using语句来主动释放实现IDsposable的对象所持有的资源,使用 using 语句可以确保即使在发生非常的情况下也能精确释放资源。
实例中StreamReader实现了IDsposable接口。
通过使用using语句,当StreamReader对象超出作用域时,Dispose方法会被主动调用,从而释放文件句柄。
  1. using System;
  2. using System.IO;
  3. class Program
  4. {
  5.     static void Main()
  6.     {
  7.         using (var stream = new FileStream("demo.txt", FileMode.Open))
  8.         {
  9.             byte[] buffer = new byte[1024];
  10.             int bytesRead = stream.Read(buffer, 0, buffer.Length);
  11.             // 处理读取的数据
  12.         }
  13.         // 文件流会自动关闭
  14.      }
  15. }
复制代码
2、显式调用 Dispose 方法

假如不能使用 using 语句(例如在循环中或其他复杂情况下),可以手动调用 Dispose 方法来释放资源。当一个对象实现了IDsposable接口,意味着它持有需要手动释放的资源,实现IDsposable的对象必须重写Dispose方法来清理非托管缓存。
  1. using System;
  2. using System.IO;
  3. class Program
  4. {
  5.     static void Main()
  6.     {
  7.         FileStream stream = new FileStream("demo.txt", FileMode.Open);
  8.         try
  9.         {
  10.             byte[] buffer = new byte[1024];
  11.             int bytesRead = stream.Read(buffer, 0, buffer.Length);
  12.             // 处理读取的数据
  13.         }
  14.         finally
  15.         {
  16.             stream.Dispose();
  17.         }
  18.      }
  19. }
复制代码
总结

好了,我们今天聊了聊 .NET 中的内存管理。通过使用 using 语句和显式调用 Dispose 方法,我们可以更好地控制那些特殊的资源,比如文件和数据库连接。这样不仅能制止程序出错,还能让我们的程序运行得更加顺畅。
假如你觉得这篇文章对你有资助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。假如有任何疑问或需要进一步的资助,接待随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表