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

精通.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框架自动内存管理(2)

 

 

 

2..NET垃圾回收原理

 

 

 

托管代码则不同,.NET框架为托管对象(Managed Object)提供了完善的内存回收机制。当托管对象不可访问(unreachable)之后,即可被垃圾回收器回收。

托管对象何时被认为是“不可访问的”呢?运行库通过一套复杂的机制来跟踪对象被引用的情况,当应用程序不再有指向对象的引用时,对象就是不可访问的。在以下情况下,对象的引用不再指向对象:

Ÿ           对象的引用变量不可见(即程序执行到对象的引用变量作用域之外)时;

Ÿ           显式的将对象的引用变量置为空值(null),或者将引用变量指向其他对象,使对象与其原来的引用变量之间关系脱开。

如果希望对象能够早些被回收,则只要简单的将其引用变量置为空值,对象就有可能尽早被回收,但真正的回收需要等到相应的垃圾回收周期开始时才能进行。如以下C#代码所示:

public class Caller {

public CallerMethod() {

        Foo foo = new Foo();

        foo.FooMethod();

        ......

        Foo = null;

        ......

    }

    ......

}

public class Foo {

    ......

}

运行库从托管堆(Managed Heap)中为对象分配内存(因此称为托管对象)。垃圾回收器使用“代(Generation)”来表示托管对象在内存中的生存周期,并以此确定哪些对象应该被优先回收。垃圾回收器将托管堆分为三代:第0代(gen0)存放新创建的对象,第1代(gen1)存放生存期较长的对象,第2代(gen2)则存放长期存活的对象。垃圾回收器根据以下假定将对象存放在不同代的托管堆并执行垃圾回收:

Ÿ           新建的对象,它的生存周期可能较短;

Ÿ           在内存中存留时间越长的对象,越有可能继续被引用,因而生存期越长;

因此,垃圾回收器对第0代对象的回收周期最短,第1代次之,第2代对象的回收周期最长。新建的对象首先在gen0堆中分配内存,当gen0堆满时触发垃圾回收。由于gen0堆大部分对象的生存周期都很短,只有少量对象在垃圾回收后存活下来,并被提升到第1代,gen0堆被清空。同理,gen1堆满时触发gen1垃圾回收,存活下来的第1代对象被提升到第2代;gen2堆满时触发gen2垃圾回收,但这时存活下来的第2代对象仍然在gen2堆,即不进行代提升,因为运行库的托管堆最多只有三代。对老一代的内存回收操作包括对所有较新一代的内存回收,在这种情况下,gen1垃圾回收同时也进行gen0垃圾回收,gen2垃圾回收则同时进行gen1和gen0垃圾回收。显然,回收部分托管堆的内存比回收所有托管堆的内存效率要高,这种按代进行垃圾回收的算法提高了垃圾回收的效率,从而保证应用程序的性能。

垃圾回收器有自己独立的工作线程,当进行垃圾回收时不允许应用程序在这些对象上进行任何操作。因此垃圾回收器线程启动时将挂起所有当前正在执行的线程,直至垃圾回收线程结束。在垃圾对象回收后,存活的对象发生代跃迁时,垃圾回收器线程压缩并移动任何空闲的内存,清除内存碎片,保持连续的空闲内存空间,提高内存分配效率。因此垃圾回收器需要较大的系统资源开销,代数越高的垃圾回收,系统开销越大。

垃圾回收器执行垃圾回收的周期是不固定的,最佳回收时间由垃圾回收器引擎根据上述规则自动计算,应用程序无法预计运行库何时进行垃圾回收。在大多数情况下,应该由垃圾回收器确定执行回收的最佳时机。但是,在某些大量消耗内存的关键应用中,及时回收内存对应用程序的性能是至关重要的。这时需要在应用程序中控制非托管资源的释放时机,或者强制垃圾回收器执行垃圾回收周期。

垃圾回收器线程在以下情况下启动:

Ÿ           托管内存堆已满,启动相应代的垃圾回收;

Ÿ           应用程序执行了强制的垃圾回收;

Ÿ           运行库卸载应用程序域;

Ÿ           运行库正在被卸载。

相关推荐

RoadFlowCore v2.9.9:.NET平台的高效可视化流程引擎详解

NET框架专有的流程引擎.NET框架不仅仅是一个强大的编程环境,它在工作流领域也展示出了其独特的优势。其强类型的语言特性、跨平台的能力以及成熟的生态系统,为构建企业级流程引擎提供了稳定的基础。在工作流引擎的开发中,.NET框架提供的CLR(公共语言运行时)能够确保代码的高效执行,并且其语言互操作性(CLI)让开发者能够选择多种语言来开发工作流,进一步提升了开发效率。

weixin_35749786的博客 1011

查找、修复和避免 C# .NET 中的内存泄漏:8 个最佳实践

如果您像我一样,您可能在安装 Visual Studio 后看到了此工具窗口,然后立即关闭它,再也没有想过它。请注意,这种方法非常不可靠。还有共享内存和私有内存的问题,因此您既可能错过内存泄漏,也可能诊断出不是您自己的内存泄漏(当它们数量很少时,你可能不会注意到,但你必须时刻保持警惕,以防它们过度繁殖,闯入厨房,把所有东西都弄脏。Visual Studio 中,诊断窗口还包括一个内置的内存分析器,它确实可以找到特定的泄漏。尽管存在缺点,我还是提到了这种方法,因为它不仅易于使用,而且有时是您唯一的工具。

u011234288的博客 577

掌握.NET Framework 2.0:全功能开发框架教程

NET Framework 2.0标志着微软在其.NET技术上迈出了重要的一步。作为.NET Framework发展历程中的关键版本之一,它在2005年伴随着Visual Studio 2005一同推出,为开发者带来了诸多新特性和改进,这些变化显著提高了开发效率,增强了应用性能,并为后续版本的框架打下了坚实的基础。在.NET的实践中,泛型被广泛用于自定义类和接口,以适应多样化的业务场景。例如,集合类、存储访问类、排序算法类,甚至是事件处理器,都可以通过泛型来实现类型安全和代码复用。

weixin_42174098的博客 1267

程序内存自动管理:.NET 的垃圾回收机制(4)

本文深入解析了.NET垃圾回收(GC)机制的工作原理。主要内容包括:1).NET内存的三级划分(新生代Gen 0/1、老年代Gen 2、大对象堆LOH)及其回收策略;2)GC的完整执行流程,从触发条件、标记阶段的可达性分析,到不同代的清理算法(复制算法、标记-清除/整理);3)C#对象引用场景辨析,重点说明集合存储仅为引用传递,以及参数传递的引用/值类型差异。文章通过具体示例,揭示了CLR如何自动管理内存,并给出开发者需注意的关键点,如集合引用保持、大对象堆碎片问题等。

zLongXiong的博客 968

常学常新:《Attention Is All You Need》万字解读!

常学常新:《Attention Is All You Need》万字解读!

hunteritself的博客 3647

WS2812呼吸灯效果实战:用STM32的PWM+DMA实现流畅渐变(附完整代码)

本文详细介绍了如何使用STM32的PWM+DMA技术实现WS2812呼吸灯效果,提供完整的代码示例和调试技巧。通过PWM波形编码和DMA传输机制,解决了传统IO模拟控制方式的高CPU占用问题,实现了流畅的LED渐变效果,适用于各种嵌入式开发场景。

weixin_30566063的博客 452

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

.NET框架自动内存管理(4) 4.GC类与垃圾回收控制 运行库提供GC类使应用程序能够控制垃圾回收器的行为。前面已经述及,垃圾回收周期是不确定的,由垃圾回收器引擎自动计算最佳的垃圾回收时间。在一个需要大量消耗内存的应用程序中,如果在某个确定的时间点上已经明确占用的内存不再需要,及时释放这些内存对提高应用程序的性能有显著的影响,这时就可以强制垃圾回收器执行回收周期。GC.Collect方法强制垃圾

OpenBAAN的专栏 1011

Sentaurus TCAD 实战指南:几何、掺杂与物理模型对Ion/Ioff的协同调控

本文详细介绍了Sentaurus TCAD在器件仿真中的实战应用,重点解析了Ion(开态电流)与Ioff(关态电流)的协同优化方法。通过几何结构设计、掺杂工程和物理模型选择三大要素的精细调整,实现器件性能的显著提升。文章结合28nm和7nm工艺案例,展示了如何平衡Ion与Ioff的矛盾关系,为TCAD工程师提供实用指导。

weixin_29159711的博客 135

C#垃圾回收机制详解

GC的前世与今生 虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现。Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理。但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表。出于同样的理由,不同的人却又不同...

极客神殿 4613

AIGC大模型应用教学平台

该平台采用最新的AI推理加速芯片,提供30Tops算力和32GB存储,能够运行常见的大语言模型如ChatGLM2、Llama2、Baicuan、Mistral等,也可以运行文生图扩散模型Stable Diffusion,提供大模型微调、量化、转换和加速推理服务。在此基础上,平台还提供常见的生成式AI应用,包括AIGC知识抽取增强(RAG)、AIGC绘画、AIGC会话聊天、数字虚拟人等应用,以便学生能够掌握最新的生成式AI模型微调、提示工程和智能体应用技能。

中智讯的博客 1204

头歌MySQL数据库实训答案 有目录

头歌java实训答案集数据库部分一条一条的写,可鼠标手动粘贴,除特定命令外未分大小写。 第1关:创建数据库 第2关创建表 第3关:使用主键约束 第4关:外键约束 第5关:添加常用约束 MySQL数据库 - 数据库和表的基本操作(一) 第1关:查看表结构与修改表名 第2关:修改字段名与字段数据类型 第3关:添加与删除字段 第4关:修改字段的排列位置 第5关:删除表的外键约束 MySQL数据库 - 数据库和表的基本操作(二) 第1关:插入数据 第2关:更新数据 第3关:删除数据 MySQL数据库 - 单表查询(

m0_67401761的博客 4万+

.Net程序的内存管理和垃圾回收机制

.NET 内存管理和垃圾回收 C/C++ 程序需要开发者手动分配和释放内存,.Net程序则使用垃圾回收技术自动收集不再使用的内存。垃圾回收器(GC)使用引用 跟踪占用内存的对象,如果对象被设置为null或已不在使用范围,GC就会标志该对象为可回收,这样GC就可以回收被这些对象占用的内存。 垃圾回收器(GC)使用Win32® VirtualAlloc() 接口为自己的堆分配内存,.Ne

omage的专栏 1575

狗都能看懂的MAML原理讲解和代码实现

meta-leaning指的是元学习,元学习是深度学习的一个分支,一个好的元模型(meta-learner)应该具备对新的、少量的数据做出快速而准确的学习。通俗的来讲, 对于人来说,给几张橘猫的图片让看一下,再给你几张没见过的英短猫图片,你一定能很快识别出来都是猫。但是对于神经网络来说,并非如此。如果让一个小汽车分类网络去识别不同的大货车,那效果肯定很差。而传统的CNN网络都是输入大量的数据,然后进行分类的学习。但是这样做的问题就是,神经网络的通用性太差了,根本达不到“智能”的标准。而人类的认知系统,可以通

个人学习笔记 6万+

Garbage Collection Part 2: Automatic Memory Management in the Microsoft .NET Framework垃圾回收:在微软NET框架自动内存管理 (二)

Garbage Collection Part 2: Automatic Memory Management in the Microsoft .NET Framework垃圾回收:在微软NET框架自动内存管理 (二)原文地址:http://msdn.microsoft.com/en-us/magazine/bb985011.aspx概要:本文的第一部分解释了垃圾收集算法的工作原理,当垃圾收集器决定清除资源的内存时如何正确地清理,以及当对象被释放时如何强制清理对象。该系列我们将解释了强,弱引用如何帮助大对象

wangtaiping的专栏 1193

单片机技术入门与实战:从零基础到项目开发

单片机(MCU)作为嵌入式系统的核心组件,集成了CPU、内存和各种接口电路,广泛应用于智能家居、工业控制和汽车电子等领域。其工作原理基于实时控制和低功耗设计,通过定时器、中断系统和通信接口等功能模块实现各种控制任务。在物联网和智能硬件快速发展的背景下,掌握单片机开发技术成为电子工程师的重要技能。本文以STM32和PIC系列为例,详细解析单片机的基本概念、功能模块和选型指南,并分享从入门到项目实战的系统学习方法,帮助开发者在3-6个月内快速掌握这一关键技术。

weixin_35753291的博客 652

芒果YOLO11改进145:Loss损失函数KLD:即插即用 NeurIPS顶会论文,独家首发原创新颖|通过 Kullback-Leibler 散度学习用于目标检测的高精度边界框

旋转检测Loss损失函数KLD:即插即用 NeurIPS顶会论文,独家首发原创新颖|通过 Kullback-Leibler 散度学习用于目标检测的高精度边界框

包括YOLOv5、YOLOv7、YOLOv8等模型改进 565

开源项目 AzurLaneLive2DExtract 亮点详解

开源项目 AzurLaneLive2DExtract 亮点详解 1. 项目的基础介绍 AzurLaneLive2DExtract 是一个开源项目,旨在从《碧蓝航线》游戏中提取 Live2D 模型文件,以便玩家可以自由地使用这些模型进行二次创作或展示。该项目基于 C# 语言开发,使用了 .NET 框架,用户可以通过该项目方便地获取游戏中的 Live2D 模型资源。 2. 项目代码目录及介绍 项目的主...

gitblog_01154的博客 576

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

BentoML 日志系统全解析:Access Log 格式、OpenTelemetry 字段与服务级配置

BentoML 内置了一套与 OpenTelemetry 标准兼容的日志系统,用于为部署在推理服务器上的 Service 提供逐请求级别的运行洞察。本文以 [Logging 官方文档](https://link.gitcode.com/i/2206815f9dc20e00deb5e5ba71057b25) 为主体,结合仓库中的中间件、拦截器与默认配置文件源码,完整讲清三件事:服务端访问日志的格式与

gitblog_00935的博客 221

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WzComparerR2:解密冒险岛游戏资源的专业工具箱

WzComparerR2是一款专为《冒险岛》游戏设计的资源提取与分析工具,能够深入解析游戏内部的WZ文件格式,为游戏开发者、美术设计师和游戏研究者提供强大的资源访问能力。这个开源工具基于C#和.NET框架构建,支持从游戏客户端中提取图像、声音、地图、装备属性等各种资源,并进行可视化展示和批量导出。 ## 1. 项目核心价值:为什么你需要WzComparerR2? **🎯 解决游戏资源访问难题

gitblog_00012的博客 116

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

unity尧明的博客 528

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

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

gitblog_01104的博客 785

CLR与.NET框架的关系

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

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

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

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

unity尧明的博客 372

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

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

相信相信的力量 2844

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

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

OpenBAAN的专栏 1177

深入理解 C# 与.NET 框架

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值