首页 > 系统相关 >.Net内存管理释放的两种方式

.Net内存管理释放的两种方式

时间:2024-08-03 08:55:56浏览次数:9  
标签:释放 Dispose StreamReader 内存 using Net line

在.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();
        // }
    }
}

标签:释放,Dispose,StreamReader,内存,using,Net,line
From: https://www.cnblogs.com/bobowww/p/18340014

相关文章

  • SDN(Software-Defined Networking,软件定义网络),NFV(Network Functions Virtualization,网
    目录SDN(Software-DefinedNetworking,软件定义网络)NFV(NetworkFunctionsVirtualization,网络功能虚拟化)SDN(软件定义网络)NFV(网络功能虚拟化)SDN的优势NFV的优势DC(数据中心)网关与MEC(移动边缘计算)节点DC网关MEC节点DC网关与MEC节点的协同作用SDN(Software-DefinedNet......
  • CIFAR-10 Implementing a Convolutional Neural Network
    Coding Assignment 4: Implementing aConvolutional Neural Network for CIFAR-10using KerasJuly 28, 20241 OverviewInthisassignment,youwillimplement a Convolutional Neural Network (CNN) to classify images from the CIFAR-10 dataset......
  • C语言数据在内存中的存储超详解
    文章目录1.整数在内存中的存储2.大小端字节序和字节序判断2.1什么是大小端?2.2为什么会有大小端?2.3练习3.浮点数在内存中的存储3.1一个代码3.2浮点数的存储3.2.1浮点数存的过程3.2.2浮点数取的过程3.3题目解析1.整数在内存中的存储在操作符......
  • Redis学习[5] ——Redis过期删除和内存淘汰
    六、Redis过期键值删除6.1Redis的过期键值删除策略6.1.1什么是过期键值删除?Redis中是可以对key设置过期时间的,所以需要有相应的机制将已过期的键值对删除,也就是**过期键值删除策略。Redis会用一个过期字典(expiresdict)**来存储有过期时间的所有key。当查询一个key时,Red......
  • Spark内存计算引擎原理与代码实例讲解
    Spark内存计算引擎原理与代码实例讲解关键词:Spark,内存计算,RDD,DAG,Shuffle,容错,分布式计算1.背景介绍1.1问题的由来随着大数据时代的到来,传统的基于磁盘的MapReduce计算框架已经无法满足实时计算、迭代计算等场景对计算性能的要求。Spark应运而生,其基于内......
  • 深入解析与实战:解决 npm ERR! network ‘proxy‘ 配置问题
    在日常的前端开发工作中,使用npm(NodePackageManager)进行依赖管理已经成为了常态。然而,在某些情况下,我们可能会遇到网络配置问题导致的错误信息,比如npmERR!network'proxy'configissetproperly。本文将详细介绍如何解决这一问题,并通过实际案例演示正确的配置方法。......
  • 打靶记录5——靶机hard_socnet2
    靶机:https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova目标:取得root权限涉及攻击方法主机发现端口扫描SQL注入文件上传蚁剑上线XMLRPC命令执行逆向工程动态调试漏洞利用代码编写方法CVE-2021-3493缓冲器溢出漏洞学习目标希望通过今天学习......
  • net core使用ADO.NET
     System.Data.SqlClient是.NETFramework使用ADO.NET旧提供程序。Microsoft.Data.SqlClient软件包于2019年发布,它是同时支持.NETCore和.NETFramework的新软件包。所以现在最好使用Microsoft.Data.SqlClientNuGet中查询安装即可。  注:Microsoft.Data.SqlClient程序......
  • .Net 6.0 Web API 项目生成镜像并上传到私有仓库 Harbor
    〇、前言本文首先简单介绍了Dockerfile内容和常用命令;然后是在Windows环境Dockerdesktop的安装和配置;最后创建了WebAPI示例项目,并简单说明了从构建到推送至Harbor镜像仓库的步骤。一、关于Dockerfile1.1Dockerfile文件示例#Seehttps://aka.ms/customizecont......
  • .net项目使用Docker部署(包括解决后台验证码,部署后不显示的问题)
    Vue部署到Docker参考文档:手把手教你用Docker部署Vue3项目_docker部署vue3项目-CSDN博客参考文档:dockerfile部署前端vue项目_vuedockerfile-CSDN博客nginx文档:使用docker安装nginx-静以修身俭以养德-博客园(cnblogs.com)结合使用了两个文档的方法和DockerFIle区别......