.NET框架自动内存管理(3)

精通.NET内存管理《Pro .NET Memory Management》知识点总结 .NET内存管理不是魔法——理解GC的机械同情(Mechanical Sympathy),才能在性能与资源间找到平衡点。当你能从CPU缓存行的维度思考数组布局,从虚拟地址的视角解构对象生命周期,便是真正掌握了这门黑暗艺术。:2021版(涵盖.NET 5/6,对比JVM内存模型):Konrad Kokosa(微软MVP,GC专家):从CLR源码层解构内存机制,提供生产环境调优方法论。dotnet-counters监控。:《精通.NET内存管理》(验证SafeHandle释放。Handle计数上升。 阅读详情

.NET框架自动内存管理(3)

 

3.Finalize方法和对象的析构函数

 

System.Object对象提供Finalize方法,垃圾回收器在回收对象的内存之前,自动调用Finalize方法,然后回收对象占用的内存。默认情况下,Finalize方法不执行任何操作,如果需要让垃圾回收器在回收对象的内存之前执行对非托管资源等的清理操作,则派生类必须重写Finalize方法。

垃圾回收器使用“终止队列(Finalization List)”的内部结构跟踪重写Finalize方法的托管对象的生命周期:每次使用new运算符创建这种对象时,运行库从托管堆为该对象分配内存的同时,垃圾回收器还在“终止队列”中放置一个指向该对象的引用项。

当垃圾回收器执行内存回收时,它首先回收没有重写Finalize方法的不可访问对象,重写Finalize方法的不可访问对象在“终止队列”中的对应项被移除并放置到称为“freachable”的对象列表中。然后,垃圾回收器启动一个特殊的线程扫描并调用该对象列表中对象的Finalize方法,在Finalize方法中应用程序封装了清除非托管资源的代码。最后,将Finalize方法已调用的对象从列表中移出。 在下一次垃圾回收时,垃圾回收器将从“freachable”列表中移出的对象确定为垃圾,并回收其内存。

从上述垃圾回收过程可以看出,回收重写Finalize方法的对象使用的内存至少需要两次垃圾回收过程。因此重写Finalzie方法可能会对应用程序性能产生负面影响,应尽量避免使用它们。如果对象没有封装非托管资源,则不要轻易重写Finalize方法。

Object.Finalize方法被声明为受保护的(protected),这意味着Finalize方法保留给垃圾回收器自动调用,应用程序不应直接调用对象的Finalize方法。为保证基类的Finalize方法能够被垃圾回收器正确调用,在重写派生类的Finalize方法时,必须调用其基类的Finalize方法,这也是唯一一种允许在应用程序中调用Finalize的情况。

为确保在派生类的Finalize方法中调用基类的Finalize方法,C#提供了更加简洁的编程机制—析构函数,虽然和C++类的析构函数有相同的名称和语法,但C#对象的析构函数意义却完全不同:并非所有的C#对象都需要析构函数,只有那些需要重写Finalize方法的对象才需要析构函数,而且在析构函数中将自动隐式地封装对基类Finalize方法的调用。例如,某个从BaseClass类派生的DerivedClass类的析构函数

~DerivedClass()

{

    // some lines of code to perform cleanup operations here

}

将被运行库自动隐式地翻译为以下代码

protected override void Finalize()

{

    try

    {

        // some lines of code to perform cleanup operations here

    }

    finally

    {

        base.Finalize();

    }

}

通过上述等效的代码结构确保了BaseClass的Finalize方法总是能够被调用。因此C#编写的应用程序不直接重写基类的Finalize方法,而在需要重写基类的Finalize方法时为该类添加析构函数。

注意,垃圾回收器不能保证对象Finalize方法的调用顺序,因此在重写Finalize方法时不要引用任何其他托管对象,除非你能确信当前对象的Finalize方法被调用时,被引用的托管对象仍然在其生存期内。也就是说,如果对象A有一个指向对象B的引用,在A对象的Finalize方法中不应通过该引用对B对象作任何操作:

public class A {

    B b = new B();

    ......

~A() {

        // error

        b.MethodB();

}

}

public class B {

    public MethodB() {

        ......

    }

}

相关推荐

.net core 内存管理

在使用 .NET Core 开发时,内存管理是一个非常重要的话题。理解和优化内存管理可以帮助你提高应用程序的性能,避免内存泄漏以及减少垃圾回收的开销

1041

垃圾回收GC:.Net自动内存管理 上(二)内存算法

GC检测用于查看堆中是否有对象不再被程序使用。如果这样的对象存在,这些对象占用的内存就可以被回收利用。(如果堆中没有可用内存空间时,new操作符将会抛出OutOfMemoryException异常)GC是怎样知道一个对象是否还被程序使用呢?你可以想象一下,这不是一个容易回答的问题。 每一个程序都有一组根节点(roots),它们用于识别定位托管堆中的对象或空(null)对象指向的存储空间。比如,程序中所有全局对象指针或静态对象指针都被看作是程序根节点(roots)的一部分。另外,线程栈中任何局部变量或参数对象

LeeWhoee University 2845

net 自动内存管理

在执行第 0 级托管堆的首次回收并把可访问的对象升级至第 1 级托管堆后,垃圾回收器将考虑第 0 级托管堆的其余部分。例如,如果第 0 级托管堆的回收没有回收足够的内存,不能使应用程序成功完成创建新对象的尝试,垃圾回收器就会先执行第 1 级托管堆的回收,然后再执行第 2 级托管堆的回收。由于垃圾回收器只支持三个级别,因此第 2 级托管堆中未被回收的对象会继续保留在第 2 级托管堆中,直到在将来的回收中确定它们为无法访问为止。垃圾回收器执行第 0 级托管堆的回收后,会压缩可访问对象的内存,如本主题前面的。

Code365 781

.NET Runtime测试自动化:自动化框架

.NET Runtime作为微软跨平台运行时的核心组件,其测试自动化框架是一个高度复杂且功能强大的系统。该框架支持从单元测试到集成测试、从本地执行到分布式云测试的全方位测试场景,确保.NET Runtime在各种平台和配置下的稳定性和性能。 ## 自动化测试架构 .NET Runtime测试自动化框架采用分层架构设计,主要包含以下核心组件: ```mermaid flowchart TD ...

gitblog_01104的博客 785

地质建模师必备:用Petrel快速生成浅地层TST/TVT厚度图的5个关键步骤

本文详细解析了地质建模师如何利用Petrel平台,将二维浅地层SEG-Y数据高效转化为真实地层厚度图(TST)和真实垂直厚度图(TVT)。文章系统梳理了从数据规范化导入、坐标系统一、地质界面解释到厚度计算与成图的5个关键实战步骤,并强调了误差控制与工程应用,为海上风电等工程地质评估提供了完整解决方案。

weixin_29204205的博客 518

STM32F407 HAL库定时器触发ADC采集与DMA数据传输(定时器TIM+ADC+DMA)

在STM32F407系列微控制器的开发中,结合定时器、ADC(模数转换器)与DMA(直接存储器访问)控制器,能够显著提升数据采集与传输的效率。本文将指导你如何使用STM32 HAL库,通过定时器触发ADC1的单通道采集,利用DMA传输数据,最终通过串口将电压值打印出来。具体实现中,我们将读取ADC1的通道5(对应引脚PA5),并将转换得到的电压值发送到串口助手上进行显示。

jmlinux的博客 7011

CLR与.NET框架的关系

CLR是.NET框架的核心,提供了执行、管理和优化.NET应用程序所需的基础设施。它负责将中间语言(IL)代码转换为机器代码,并提供内存管理、类型安全、异常处理、安全性、反射和多线程支持等功能。理解CLR的工作原理和功能,对于开发高效、安全的.NET应用程序至关重要。通过CLR,开发者可以专注于业务逻辑,而不必过多关注底层的实现细节。语言互操作性语言互操作性是CLR的一项关键特性,它通过支持多种编程语言和提供统一的类型系统(CTS)来实现不同语言之间的无缝协作。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 935

忆阻器(二)——忆阻模拟器

除了真实的器件,我们也可以用运放和乘法器来搭忆阻模拟器。这节将介绍数学模型、matlab仿真及multisim仿真。 一、数学模型 忆阻分为磁控和荷控两种,这里介绍三次非线性磁控忆阻模型: {I=W(φ)VW(φ)=a+3bφ2dφdt=V \begin{cases} I=W(\varphi)V \\ W(\varphi)=a+3b \varphi ^2\\ \frac{d \varphi }{dt}=V \end{cases} ⎩⎪⎨⎪⎧​I=W(φ)VW(φ)=a+3bφ2dtdφ​=V​ 这里的WWW

http://www.icfgblog.com/ 1万+

[C#] .net 内存管理[3]

自动内存管理   为了克服手动内存管理的问题并为程序员提供更愉快的处理方式,已经提出了不同的自动内存管理方法。 有趣的是,与第二古老的高级编程语言 LISP 一样古老,大约在 1958 年提出(仅比 FORTRAN 晚几年),在该领域可以提供很多东西。 由于在很大程度上基于列表处理的主要函数式语言中 - 手动内存管理会非常不舒服。 函数式编程范式将程序视为对组合函数的评估,并强烈避免数据修改(突变)和副作用。 分配和释放内存是高度可变的并且有明显的副作用。 在函数式代码中以这种方式处理内存会使它充满命令式气

unity尧明的博客 471

TNS-12516及ORA-12516错误解决

在客户端进行sqlplus连接报错如下: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 在/home/oracle/product/10.2.0/db_1/network/log/listener.log中查看到错误如下: TNS-12516: TNS:listener could not find available handler with matchin

KEL 2万+

【物联网】探索NE555:一款经典的集成电路(超详细)

NE555是一种集成电路,其内部结构包括比较器、RS触发器、电压比较器和输出级三个主要功能模块,外部引脚则提供了与其他电路元件进行连接的接口。NE555的设计目的是为了提供一种简单方便的定时器解决方案,它广泛应用于模拟和数字电路中。NE555作为一款经典的集成电路,具备设计简单、易于使用和稳定可靠的特点,在电子领域发展了广泛的应用。从单稳态模式到多稳态模式,再到振荡器模式,NE555可以满足不同的需求,并且可以与其他电路元件灵活组合,扩展其功能。然而,需要注意的是NE555也有一些限制。

Goforyouqp的博客 6万+

[C#] .net 内存管理[1]

  在计算机科学中,内存一直存在——从打孔卡到磁带,再到如今复杂的 DRAM 芯片。 它会一直存在,可能以科幻全息芯片的形式出现,或者甚至是我们现在无法想象的更神奇的事物。 当然,记忆在那里不是没有原因的。 众所周知,计算机程序被认为是结合在一起的算法和数据结构。 我非常喜欢这句话。 可能每个人都至少听说过 Niklaus Wirth(Prentice Hall,1976 年)写的 Algorithms + Data Structures = Programs 一书,这句名言就是出自于此。   从软件工程领

unity尧明的博客 372

SerDes系列之FFE均衡技术

FFE的基本结构可以在RX侧或TX侧实现,其基本工作原理相同:它通过从同一信号源应用适当的延迟来产生多径信号,然后对它们进行线性缩放和组合以消除信道ISI。

一只豌豆象的博客 4242

.NET框架自动内存管理(1)

.NET框架自动内存管理(1)  对于C/C++程序员,在内存管理方面慎之又慎一点也不过分,因为内存漏损(占用的内存未及时释放)和野指针(指向已释放的内存块)错误给应用程序稳定性带来的影响可能会是灾难性的,而你又很难预料这一错误何时发生以及错误的后果。到了.NET框架时代,C#程序员在内存管理方面的担忧可以一扫而去了。因为.NET框架的垃圾回收器自动管理着应用程序的内存分配和释放。垃圾回收器优化引

OpenBAAN的专栏 1177

Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)

在 Android 系统这个庞大而复杂的体系里,RIL(Radio Interface Layer,无线接口层)绝对是个关键角色。简单来讲,它就像一座桥梁,一头连着手机基带,另一头接着上层应用 ,在应用程序和调制解调器(Modem)之间搭建起了信息交流的通道。想象一下,咱们在手机上点击拨号按钮,或者编辑一条短信发送出去,这些操作产生的请求并不会直接到达手机的基带处理器。而是先由 RIL 接手,它把这些来自上层应用程序的请求,像拨号、发送短信这类,巧妙地转换成能够和基带处理器顺畅交互的命令。

大模型大数据攻城狮的专栏 1597

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

.NET框架-内存管理-变量创建与销毁

.NET中memory stack and heap 做什么用的? GC如何回收资源? 析构函数,Finalize()方法,using语法糖,和IDisposable接口功用是什么? 如何更安全的释放资源(managed and unmanaged resources)?

相信相信的力量 2844

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深入理解 C# 与.NET 框架

C# 是由微软开发的一种类型安全、面向对象的编程语言,它融合了 C 和 C++ 的语法风格,并汲取了其他编程语言的优点。C# 旨在为开发者提供一种简洁、高效且易于学习的语言,用于开发各种类型的应用程序。.NET 框架是一个由微软开发的综合性开发平台,它为开发人员提供了一个统一的编程模型,涵盖了多种编程语言(如 C#、Visual Basic.NET 等)。.NET 框架包含了公共语言运行时(CLR)和.NET 类库。C# 与.NET 框架的结合为开发者提供了一个高效、强大的开发平台。

zsnandzmn的博客 1620

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

垃圾回收GC:.Net自动内存管理 上(一)内存分配

.NET CLR将所有资源分配到托管堆上,这有点像C语言中的堆但是你不用去释放资源因为闲置资源在.NET中将被自动释放。现在就有一个问题了,托管堆是怎么知道一个对象什么时候将不再被程序使用?现今有很多的GC算法。每一个算法都针对某一特定环境进行调优,进而获得最好的性能。这篇文章着重于.NET CLR使用的GC算法。.Net下的GC完全解决了开发者跟踪内存使用以及控制释放内存的窘态。然而,你或许想要理解GC是怎么工作的。此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包含非常详细的内在算法描述。同时,

LeeWhoee University 3012

[C#] .net 内存管理[2]

基本概念   让我们从一个简单但非常重要的问题开始。 如果 .NET 内存管理全部自动化,您什么时候应该关心它? 你应该关心吗? 正如您可能对我写了这样一本书所期望的那样——我强烈建议您记住每个开发人员处境中的内存。 这只是我们专业性的问题。 我们如何开展工作的结果。 我们是在努力做到最好还是只是制造? 如果我们关注我们工作的质量,我们不应该只担心我们的工作只是工作。 我们应该担心它是如何工作的。 它在 CPU 和内存使用方面是否最佳? 它是否可维护、可测试、为扩展而开放但为修改而关闭? 我们的代码可靠吗?

unity尧明的博客 528

C# 自动内存管理

开发工具与关键技术:Microsoft Visual Studio 2015、.NET 撰写时间:2019年07月22日 手工内存管理需要开发者管理内存块的分配和重新分配。手工管理内存既耗时又困难。提供自动内存管理可以使开发者从繁重的任务中解放出来。 在大多数情况下,自动内存管理可以在没有反面影响表现和性能的情况下增加代码的质量,提高开发者生产力。 例子: public class Stack ...

⊱MinG⊰ の 博 232

.NET框架自动内存管理(6)

.NET框架自动内存管理(6)    在上述代码示例中,DisposeBase是可以在应用程序中直接使用的抽象基类,它提供了dispose模式清理非托管资源的基本框架。基类DisposeBase实现IDisposable接口,提供由应用程序调用的公共Dispose()方法,注意该方法是不能由派生类重写的非虚方法,以简化派生类的dispose模式设计。该方法通过调用受保护的virtual Dispo

OpenBAAN的专栏 909

.NET Framework 框架

.NET Framework 框架

book_dw5189的博客 1988

.Net框架概述

概述      Microsoft.Net代表了一个集合、一个环境、一个可以作为平台支持下一代Internet的可编程结构,它通过使用HTTP,XML等标准,使得各个系统平台间互操作性成为现实,Microsoft.Net最重要部分是.Net框架,.Net框架是一种新的计算平台,它简化了在高度分布式Internet环境中的应用程序开发,它支持超过20种不同的编程语言,它帮助开发人员把精力集中在实

星星球---忒love思纯 1672

C++内存管理框架?

具体也说不清为什么,一直对C++语言很着迷,即使现在很少使用。做应用系统,讲究的是RAD,不是用Java平台就是.Net平台。C++已经退居幕后,用来做那些高效的,安全的,或需要更强控制功能的程序,比如底层的引擎,硬件相关的或平台级的程序。就像很多已经消失的东西,有一天C++也会消失(我会伤心的)。 C++在堆上分配的内存是由开发者自己控制的,对于复杂逻辑或者应用一些模式时,内存管理可能会

timersun的专栏 1419

C# 和 .NET 框架的关系

目录一、在 .NET 之前二、.NET 时代2.1 .NET 框架的组成2.2 改进的编程环境三、编译成 CIL四、编译成本机代码并执行编译和执行五、CLR六、CLICLI 的重要组成部分七、各种缩写 C#(读作“See Sharp”)是一种新式编程语言,不仅面向对象,还类型安全。 C# 源于 C 语言系列,C、C++、Java 和 JavaScript 程序员很快就可以上手使用。 一、在 .NET 之前 C# 编程语言是为了在微软公司的 .NET 框架(.NET Framework)上开发程序而设计的。.

Globalizationa的博客 2428
上一篇: .NET框架自动内存管理(4)
下一篇: .NET框架自动内存管理(2)
OpenBAAN
博客等级 码龄21年 0粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值