首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年10月14日 09:59

前言

嗨,大家好!今天我们要聊一聊 .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方法会被自动调用,从而释放文件句柄。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        using (var stream = new FileStream("demo.txt", FileMode.Open))
        {
            byte[] buffer = new byte[1024];
            int bytesRead = stream.Read(buffer, 0, buffer.Length);
            // 处理读取的数据
        }
        // 文件流会自动关闭
     }
}

2、显式调用 Dispose 方法

如果不能使用 using 语句(例如在循环中或其他复杂情况下),可以手动调用 Dispose 方法来释放资源。当一个对象实现了IDsposable接口,意味着它持有需要手动释放的资源,实现IDsposable的对象必须重写Dispose方法来清理非托管缓存。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        FileStream stream = new FileStream("demo.txt", FileMode.Open);
        try
        {
            byte[] buffer = new byte[1024];
            int bytesRead = stream.Read(buffer, 0, buffer.Length);
            // 处理读取的数据
        }
        finally
        {
            stream.Dispose();
        }
     }
}

总结

好了,我们今天聊了聊 .NET 中的内存管理。通过使用 using 语句和显式调用 Dispose 方法,我们可以更好地控制那些特殊的资源,比如文件和数据库连接。这样不仅能避免程序出错,还能让我们的程序运行得更加顺畅。

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

From:https://www.cnblogs.com/1312mn/p/18340767
本文地址: http://shuzixingkong.net/article/2477
0评论
提交 加载更多评论
其他文章 MySQL数据的导出
有时需要将MySQL数据库中的数据导出到外部存储文件中,MySQL数据库中的数据可以导出成sql文本文件、xml文件或者html文件。本节将介绍数据导出的常用方法。 11.4.1 使用SELECT…INTO OUTFILE导出文本文件 MySQL数据库导出数据时,允许使用包含导出定义的SELECT语
MySQL数据的导出 MySQL数据的导出 MySQL数据的导出
nicegui太香了,跨平台开发和跨平台运行--使用Python+nicegui实现系统布局界面的开发
在现今国产化浪潮的驱动下,跨平台或者缩小范围说基于国产化Linux或者基于国产鸿蒙系统的开发才是未来的趋势了,风口浪尖上,我们开发人员也只能顺势而为,本篇随笔介绍在Python开发中,使用使用Python+nicegui实现系统布局界面的开发。
nicegui太香了,跨平台开发和跨平台运行--使用Python+nicegui实现系统布局界面的开发 nicegui太香了,跨平台开发和跨平台运行--使用Python+nicegui实现系统布局界面的开发 nicegui太香了,跨平台开发和跨平台运行--使用Python+nicegui实现系统布局界面的开发
AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo
AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo。
AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo
SaaS架构:中央库存系统架构设计
大家好,我是汤师爷~ 近年来,越来越多的零售企业大力发展全渠道业务。在销售额增长上,通过线上的小程序、直播、平台渠道等方式,拓展流量变现渠道。在会员增长方面,通过多样的互动方式,全渠道触达消费者,扩大会员规模。而全渠道的库存管理,逐渐变成零售商在渠道运营方面的核心活动,也是提高库存周转率,保证利润的
SaaS架构:中央库存系统架构设计 SaaS架构:中央库存系统架构设计 SaaS架构:中央库存系统架构设计
全网最适合入门的面向对象编程教程:57 Python字符串与序列化-序列化与反序列化
Python序列化与反序列化是将Python对象转换为字节流(序列化)以便存储或传输,和将字节流转换回对象(反序列化)的过程,pickle模块和shelve模块是Python内置的序列化工具,以将Python对象序列化为二进制数据并存储或传输。
全网最适合入门的面向对象编程教程:57 Python字符串与序列化-序列化与反序列化 全网最适合入门的面向对象编程教程:57 Python字符串与序列化-序列化与反序列化 全网最适合入门的面向对象编程教程:57 Python字符串与序列化-序列化与反序列化
浅谈 K-D Tree 及其进阶应用
前言 \(\text{K-D Tree (K-Dimension Tree)}\) 是一种可以有效处理高维信息的数据结构。 在一般信息学竞赛题目中 \(k = 2\),此时它又称 \(\text{2-D Tree}\)。 但遗憾的是,\(k \ge 3\) 的情况并不常见,这个我们后面再说明原因。
浅谈 K-D Tree 及其进阶应用 浅谈 K-D Tree 及其进阶应用
Transformer的Pytorch实现【1】
使用Pytorch手把手搭建一个Transformer网络结构并完成一个小型翻译任务。 首先,对Transformer结构进行拆解,Transformer由编码器和解码器(Encoder-Decoder)组成,编码器由Multi-Head Attention + Feed-Forward Netwo
Transformer的Pytorch实现【1】 Transformer的Pytorch实现【1】 Transformer的Pytorch实现【1】
QToss:基于.NET架构的跨境电商的工具,助力企业实现智能数据营销
2024年10月13日下午参加了一场在深圳举办的跨境电商大佬们的聚会,现场参加的人数上千人。 大会分享嘉宾中有位来自美国的,他告诉我们不用担心美国政府会把TikTok禁掉,TikTok在全世界都很受欢迎的。回归正题说说今天大会上发布的这个产品Qtoss AI选品,这是一个由.NET 助力的AI驱动跨
QToss:基于.NET架构的跨境电商的工具,助力企业实现智能数据营销 QToss:基于.NET架构的跨境电商的工具,助力企业实现智能数据营销 QToss:基于.NET架构的跨境电商的工具,助力企业实现智能数据营销