.NET GC 精要(七)

Github 的一个免费编程书籍列表 Index AdaAgdaAlefAndroidAPLArduinoASP.NET MVCAssembly Language Non-X86 AutoHotkeyAutotoolsAwkBashBasicBETACC#C++ChapelCilkClojureCOBOLCoffeeScriptColdFusionCoolCoqDDartDB2Delphi / PascalDTraceE 阅读详情

本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management
(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)

深入
并发执行模式(工作站模式下)的一点细节

之前讲到工作站模式分为 并发 和 非并发 两种执行模式,其中非并发 执行模式比较容易理解,即在整个 GC 流程中应用线程(application thread)是暂停的(非并发执行模式一般适用于单核运行环境).

而对于并发执行模式,细节上则会复杂一些:

并发执行模式下, Gen 0 回收 和 Gen 1 回收 仍然会暂停应用线程,只有在 Full GC(即 Gen 2 回收)时才会有并发行为,并且在整个 GC 流程中一般只会造成应用线程 2 次(短期)暂停.

相关实现上,由于 Full GC 发生时,需要检查回收的内存范围(称为 GC domain)是确定的,所以应用线程可以在 Full GC 的同时于当前 GC domain 以外的内存范围中 申请对象,当然由于内存段的大小限制, 并发执行 GC 时,内存段上还会被设置特殊的内存区域(称为 No Go Zone),如果应用线程的对象申请达到了这个区域,则应用线程仍然会被暂停.

示意图如下:

在这里插入图片描述

(可以看到,Full GC 过程中,应用线程仍然可以申请对象(Object L, M, N 和 O))

并发执行模式虽然允许应用线程在 Full GC 过程中继续申请对象,但仍然有不少限制(申请对象不能触及 No Go Zone 区域;申请的对象即使不被引用也不能(被本次 GC )回收(譬如上面示意图中的 Object M)),为了解决这个问题, .NET 4.0 引入了 Background Workstation GC, .NET 4.5 甚至引入了 Background Server GC,有兴趣的朋友可以继续了解.

弱引用(Weak References)

对于一些大内存对象,如果每次使用时都进行创建和释放,则程序效率不高,但如果(创建之后)一直保留引用的话,内存消耗又比较大,使用弱引用可以缓解这个问题:

// load a big data structure
var bigDataObject = new BigDataStructure();

// get a weak reference to it
var weakRef = new WeakReference(bigDataObject, false);
// destroy the strong reference, keeping the weak reference
bigDataObject = null;

// ...

// some time later try and get a strong reference back
bigDataObject = (BigDataStructure)weakRef.Target;
// recreate if weak ref was reclaimed
if (bigDataObject == null)
{
    bigDataObject = new BigDataStructure();
}

.NET 中, 弱引用被分为两类:

  • short weak references

对于 short weak references, GC 如果发现其引用对象没有被遍历流程标记,即会清理其引用对象.

创建方式:

// pass false to WeakReference's constructor
var shortWeakRef = new WeakReference(object, false);
  • long weak references

对于 long weak references, GC 如果发现其引用对象没有被遍历流程标记并且不在 Finalization Queue 中,即会清理其引用对象.

创建方式:

// pass true to WeakReference's constructor
var longWeakRef = new WeakReference(object, true);
GCHandle

GCHandle 可以用于追踪对象堆上的 Object ,一大用处就是支持托管程序和非托管程序之间的互操作.

GCHandle 的类型分为 4 种:

  • Normal 用于追踪一般对象
  • Weak 用于追踪 short weak references
  • Weak 用于追踪 long weak references
  • Pinned 用于固定对象的内存地址

以下是互操作的一段示例代码:

var buffer = new byte[512];
var h = GCHandle.Alloc(buffer, GCHandleType.Pinned);
var ptr = h.AddrOfPinnedObject();

// Call native API and pass buffer
// ...

if (h.IsAllocated) 
{
    h.Free();
}

由于非托管程序一般需要保证对象的内存地址不变,所以我们使用 GCHandleType.Pinned 来固定对象的内存地址,值得一提的是,使用 fixed 语句块也会固定对应的对象内存地址:

unsafe static void Main()
{
    Person p = new Person();
    p.age = 25;
    // Pin p
    fixed (int* a = &p.age)
    {
        // Do something
    }
    // p unpinned
}

之前提到 SOH 为了解决内存碎片问题会进行内存压缩,但是由于其不能调整固定内存地址的对象,所以使用 GCHandleType.Pinned 会对 SOH 的内存压缩流程造成影响,使用时应尽量缩短对象的固定时间.

系列文章完

精通.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计数上升。 阅读详情

相关推荐

双目深度算法——基于Cost Volume的方法(GC-Net / PSM-Net / GA-Net)

本篇博客可以主要是义GC-Net为例,解释什么是Cost Volume以及为什么要用3D卷积来进行推理。

weixin_44580210的博客 8521

Pro .NET Memory Management 免积分下载

图书说明: 了解.NET内存管理的内部工作,陷阱和技术,以便有效地避免软件中的各种性能和可伸缩性问题。尽管在.NET中进行了自动内存管理,但在理解.NET内存如何工作以及如何最有效地编写与其交互的软件方面有很多优势。Pro .NET内存管理是通过理解和使用.NET中的内存管理来编写更好的软件的综合指南。 本书由Microsoft的.NET团队进行了彻底的审查,包含25个有价值的故障排除方案,...

qq_41845555的博客 629

.NET 8 组件之 GC 垃圾回收组件

NET 8 中的 GC 垃圾回收组件在性能、稳定性和可配置性方面都有显著提升,为开发者提供了更强大的内存管理工具。通过合理配置和调优 GC,开发者可以有效提升应用程序的性能和稳定性,从而更好地满足用户需求。.NET 8 的 GC 组件不仅适用于大型企业级应用,也能在小型移动应用中发挥重要作用,为各种场景下的应用程序提供卓越的内存管理支持。

hy_4377的博客 1832

[C#] .net 内存管理[7] - windows内存分析软件

从适用于 Windows 10 的 Windows Performance Toolkit 版本中,有一种方法可以根据事件负载绘制自己的图表。换句话说,我们可以绘制 Y 轴来自选定事件字段之一的图表。X 轴将自动成为事件的时间。唯一的要求是所选字段具有整数值。不幸的是,这个限制对我们来说非常不利。垃圾收集器领域中的绝大多数有趣事件均以十六进制格式给出。这适用于各种大小、内存使用等等。这使得该机制目前没有多大用处,我们根本不会使用它。

unity尧明的博客 3345

高清彩版 Apress.Pro.NET.Memory.Management

高清彩版 Apress.Pro.NET.Memory.Management

memory management

memory management clock-pro

.NET GC 精要(三)

本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management (注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等) 进阶 .NET 为了处理非托管资源(unmanaged resource)的释放问题,引入了终结器(Finalization)的机制,相关的代码实现上也并不复杂,仅需要在类型中定...

tkokof1的专栏 554

Pro .NET Memory Management

Understand .NET memory management internal workings, pitfalls, and techniques in order to effectively avoid a wide range of performance and scalability problems in your software. Despite automatic memory management in .NET, there are many advantages to be found in understanding how .NET memory works and how you can best write software that interacts with it efficiently and effectively. Pro .NET Memory Management is your comprehensive guide to writing better software by understanding and working with memory management in .NET.

.NET GC 精要(二)

本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management (注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等) 进阶 之前我们讲述 SOH(Small Object Heap) 时提过其会执行内存压缩过程,但如果程序中存在大量的(小)对象的话,在 SOH 中完整执行一遍内存压缩也会消耗不少...

tkokof1的专栏 1911

避坑指南:锐浪报表PictureBox打印图像常见的5大问题及解决方案

本文深入剖析了锐浪报表(Grid++Report)中PictureBox控件打印图像时常见的五大难题,包括图像源加载机制、拉伸失真、动态加载失败、跨平台兼容性及性能优化。文章提供了从原理理解到实战解决方案的完整指南,帮助开发者有效规避图像打印中的常见陷阱,确保报表输出的稳定与高质量。

water的专栏 1148

【数据攻略】字节面试真题(含答案)+100道面试题库

数据攻略

qq_40002713的博客 4102

【CLR C#】面向面试的.Net的GC(垃圾回收)机制及其整体流程

在.NET程序开发中,为了将开发人员从繁琐的内存管理中解脱出来,将更多的精力花费在业务逻辑上,CLR提供了自动执行垃圾回收的机制来进行内存管理,开发人员甚至感觉不到这一过程的存在。.NET程序可以找出某个时间点上哪些已分配的内存空间没有被程序使用,并自动释放它们。自动找出并释放不再使用的内存空间机制,就称为垃圾回收机制。本文主要介绍dotnet中的GC(垃圾回收)机制及其整体流程。...

baidu_33146219的博客 2万+

Squareline Studio + LVGL实战:从Figma设计到MCU屏幕的UI开发一条龙(避坑中文显示)

本文详细介绍了使用Squareline Studio和LVGL实现从Figma设计到MCU屏幕UI开发的全流程,重点解决中文显示等常见问题。通过设计工具链搭建、设计稿转换、LVGL工程集成及性能优化等步骤,帮助开发者高效完成嵌入式GUI开发,提升开发效率。

weixin_29246195的博客 583

.NET GC 精要(六)

本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management (注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等) 深入 内存段(memory segment)的申请 每个托管进程(managed process)都有各自独立的 SOH 和 LOH,并且在开始执行的时候,托管进程会为 SOH ...

tkokof1的专栏 591

JMeter压力测试全攻略:从入门到精通

本文系统讲解JMeter压力测试的完整流程与结果评估方法。开篇介绍压力测试的核心概念及JMeter工具特性,随后从环境搭建入手,详细说明JDK配置、JMeter安装及中文界面设置。主体部分围绕测试流程展开,涵盖测试计划创建、线程组参数调优、HTTP请求配置、断言与监听器添加等实操步骤;结果评估环节深入解析聚合报告指标、结果树分析及性能瓶颈定位方法,并通过电商接口测试案例演示全流程应用。文末总结关键要点,为读者提供从基础操作到分布式压测、性能调优的进阶学习方向,助力掌握JMeter在系统性能评估中的核心应用。

邓邓子的博客 2414

IMX335摄像头原理图设计,已量产

从工程组织上看,IMX335 模组和 IMX415 模组属于同一类产品:核心矛盾不是外设多,而是高速图像链路、电源域和调试接口要同时兼顾。ATK-MCIMX335 这张图的结构也很直接,三路 LDO、本地 24MHz 可选时钟、4-lane MIPI 数据对和一组主板侧标准接口,构成了一张非常典型的量产摄像头子板。

不脱发的程序猿 436

.NET GC 精要(一)

本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management (注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等) 基础 稍有 .NET 基础的朋友一定知道 .NET GC 管理的是托管堆(managed heap)的内存释放问题,而托管堆又可以进一步分成两类: Small Object H...

tkokof1的专栏 2458

基于3D相机的人体穴位识别与标注系统——完整Python实现方案

摘要 本文提出了一种基于3D相机的人体穴位识别与标注系统完整实现方案。系统采用Intel RealSense D435相机实时采集RGB-D数据,结合MediaPipe Pose模型进行人体33个关键骨骼点的三维姿态估计。通过建立穴位与骨骼关键点的映射关系,利用相机内参和深度信息将二维图像坐标转换为三维空间坐标。系统采用模块化设计,包含数据采集层、算法处理层、坐标转换层和可视化层,实现了穴位定位、三维坐标转换和点云可视化功能。关键技术包括:基于骨度折量法的穴位映射算法、深度图像到三维点云的转换方法,以及Op

AI的内部世界的博客 269

39、.NET GC是什么? 为什么需要GC?

.NET GC通过自动化内存管理,彻底解决了内存泄漏、悬垂指针等传统难题,使开发者能专注于业务逻辑。其分代回收、终结化等设计兼顾了效率与灵活性。

qq_27678663的博客 1576

学Simulink--机器人基础关节控制场景实例:基于Simulink的无刷直流电机(BLDC)关节六步换相位置控制仿真

本文详细介绍了基于Simulink的BLDC六步换相位置控制仿真方法,针对机器人关节的低成本控制需求。重点阐述了霍尔定位、六步换相和位置闭环三大核心原理,通过Simulink建模实现了从霍尔信号处理到位置环控制的全流程。仿真结果表明,该系统可实现0.3°的定位精度和80ms的响应时间,满足教育机器人等应用场景需求。文章还提供了核心代码模块和参数设置方法,并探讨了转矩脉动抑制、无传感器控制等进阶优化方向,为低成本机器人关节驱动提供了实用解决方案。

amy_mhd的博客 152

YOLOv8改进 | Conv篇:基于FasterBlock与C2f结构的二次创新,参数量下降70万【附保姆级代码】

通过引入FasterBlock二次创新C2f结构,我们成功地对YOLOv8模型进行了优化,显著降低了其参数量,并提升了推理速度,而精度保持不变甚至有所提升。该模型在多个实际应用场景中展现出了优异的性能,尤其是在嵌入式设备、移动端和自动驾驶等领域,具有广泛的应用潜力。未来的研究将进一步优化模型结构,探索更多的应用场景,为目标检测技术的发展做出贡献。

一键难忘的博客 3214

.NET GC 精要(四)

本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management (注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等) 进阶 之前在讲述 GC 分代回收的时候,我们只是了解了一下 SOH(Small Object Heap) 相关的内存回收行为,实际上,在进行 Gen 2 GC(也称为 full ...

tkokof1的专栏 475

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

.NET GC 精要(五)

本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management (注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等) 深入 之前讲过 .NET GC 出于效率等因素的考虑,对 SOH(Small Object Heap)进行了分代处理(Gen 0, Gen 1 和 Gen 2),当时只是大概讲述...

tkokof1的专栏 433

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【.NET 9内存黑科技】:解锁Server GC与Workstation GC的极致差异

掌握.NET 9内存管理新特性,深入解析Server GC与Workstation GC在高并发与桌面场景下的性能差异。通过优化垃圾回收策略提升应用响应速度与吞吐量,详解适用场景与配置方法,显著改善内存效率,值得收藏。

CompiShoal的博客 811

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

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

从CLR GC到CoreCLR GC看.NET Core对云原生的支持

文章目录内存分配概要垃圾回收算法与GC运行机制GC RootGC运行机制垃圾回收时机与模式.NET Core 3.0 中的 GC 优化处理GC堆限制支持 Docker 内存限制支持 DockerCPU 限制参考文献 内存分配概要 前段时间在园子里看到有人提到了 GC 学习的重要性,很赞同他的观点。充分了解 GC 可以帮助我们更好的认识 .NET 的设计以及为何在云原生开发中 .NET Core 会...

一土宁的博客 536
上一篇: .NET GC 精要(六)
下一篇: Sweet Snippet 之 方差计算
tkokof1
tkokof1 领域专家: 游戏开发技术领域 领域专家: 游戏开发技术领域
博客等级 码龄18年 368粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值