管中窥豹----.NET Core到.NET 8 托管堆的变迁

news/2025/1/16 15:46:21/文章来源:https://www.cnblogs.com/chinasoft/p/18517447

https://www.cnblogs.com/lmy5215006/p/18515971

 

在研究.NET String底层结构时,我所观察到的情况与《.NET Core底层入门》,《.NET内存管理宝典》书中描述不符。故多研究了一下。发现.NET托管堆的结构也是越来越多,越来越高性能。

	//示例代码internal class Program{public const string constStr = "Lewis.liu";static void Main(string[] args){string name = "Lewis";var person = Person.name;var str = constStr;Debugger.Break();Console.ReadKey();}}public class Person{public static string name = "liu";}

.NET Core 3的托管堆结构

image
标准的SOH(0代,1代,2代),LOH结构,因此String Intern作为JIT编译阶段就能确定的静态内容,如果放在SOH堆中,就不太合适。存放在LOH堆中反而是更好的选择,因为LOH中没有升代,没有压缩,内存地址也不会移动。更加适合静态数据。

眼见为实----堆结构

image

眼见为实----是否分配在LOH

  1. 三个静态数据的内存地址
    image

  2. 它们的GC 引用根
    image
    三个静态数据都引用了同一个gcroot

  3. GC根分配在LOH
    image

.NET 5的托管堆结构

大家可以思考一个问题,LOH堆的定义是指>=85000byte的大对象才会进入的堆。而静态数据只是利用了LOH的特性,但本质与LOH描述不符,属于投机取巧的行为。也会给开发者带来困扰,比如说我。
因此在.NET 5 以后,CLR开发人员新增了一个Pinned object heap ,用于存储固定对象的特殊堆。来解决定义不匹配的问题
image

眼见为实----POH

image

眼见为实----是否分配在POH

image

.NET 8的托管堆结构

到了.NET 8 中,CLR团队又新增了NonGC heap ,顾名思义,这代表一个不会被GC的托管堆。很奇怪吧?
那有人就有疑问了? POH堆不是已经完美了吗?为什么还要新增堆?CLR团队给出了答案
image
主要是为了提高性能,没有写屏障,没有GC。这大大提高了效率

https://github.com/dotnet/runtime/blob/main/docs/design/features/NonGC-Heap.md
image

眼见为实----NonGC heap

image

眼见为实----是否分配在NonGC Heap

image

结论

CLR对静态数据存放一直都在优化,从最早的LOH到POH再到NonGC,在研究sting.Intern的过程中走了不少弯路。
因此大家在参考市面上的书籍时,切记知行合一,眼见为实。 否则用过时的知识去分享就贻笑大方啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824587.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 FastGPT 实现最佳 AI 翻译工作流:全世界最信达雅的翻译

想让AI翻译既准确又地道?本文将教你如何利用 FastGPT 打造一个革命性的翻译工作流。 它不仅支持文本翻译,还能直接处理文档,更能通过自定义术语表确保专业术语的翻译准确性,堪称翻译神器! 直接看效果:再来看术语表:这也太适合翻译产品官网和官方文档了吧?? 背景 吴恩达…

Major GC和Full GC的区别是什么

Major GC和Full GC是Java垃圾收集中的两种重要过程。它们的主要区别包括:1.作用范围不同;2.触发条件和时机有所不同;3.对系统性能的影响程度不同;4.处理对象的差异;5.与各种垃圾收集器的关联程度有所差异。理解这两种GC的区别对于Java开发和性能调优都是至关重要的。1.作用…

全新 PAN211X,创新技术加持。抗干扰强,兼容性好,让工程师的设计如虎添翼

在当今科技飞速发展的时代,各种先进的电子设备不断涌现,而在众多优秀的产品中,PAN211X 以其卓越的性能和独特的优势脱颖而出。 一、2.4G 无线射频:畅享高速连接 PAN211X 具备强大的 2.4G 无线射频功能,为用户带来了高速、稳定的无线连接体验。在这个信息时代,快速的数据…

小白手把手教学用spring框架实现mybatis和mysql以及工作原理

Maven_Mybatis_Mysql 什么是Mybatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old J…

Tomcat 8 报错:FAIL - Application at context path /xxxx could not be started

一、问题描述 在本地 Tomcat 部署项目后,在浏览器中打开项目报错 The origin server did not find a current representation for the target resource or is not willing to disclose that one exists造成这个错误的原因有很多,可能是路径错误,也可能是项目编译包错误,亦或…

CMDB平台(进阶篇):CMDB的应用场景剖析

配置管理数据库(Configuration Management Database,简称CMDB)是IT服务管理(ITSM)中的核心组件。随着信息技术的快速发展,大型企业的IT环境变得越来越复杂,为了更好地管理和维护这些复杂的IT基础设施,近些年来国内CMDB平台越来越多,如乐维CMDB、华为CMDB等。CMDB不仅是…

Python task

任务一: Leetcode 383 class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: cnt = Counter(magazine) for c in ransomNote: cnt[c] -= 1 if cnt[c] < 0: return False re…

19 内存与储存介质

一般电脑内存是非永久性,电源断了,内存数据将全部丢失 存储器是永久性的,除非被删除或覆盖 最初用打孔纸卡纸带来存储, 后来用延迟线存储器,利用声波来存储1,0数据。但只能顺序读取,不能任意读取 出现磁芯存储器,电流方向改变磁性也改变,将磁芯排列成网格。这种可以随…

“双系统”出炉!瑞芯微RK3562J非对称AMP:Linux+RTOS/裸机

“非对称AMP”双系统 AMP(Asymmetric Multi-Processing),即非对称多处理架构。“非对称AMP”双系统是指多个核心相对独立运行不同的操作系统或裸机应用程序,如Linux + RTOS/裸机,但需一个主核心来控制整个系统以及其它从核心。每个处理器核心相互隔离,拥有属于自己的内存,…

BitNet.cpp:革新性的1比特LLM推理框架,让CPU也能驾驭百亿参数大模型!

🌟 在人工智能的世界里,大型语言模型(LLM)以其强大的文本处理能力而闻名。但这些模型通常需要昂贵的GPU资源,这让许多开发者望而却步。今天,我们要介绍的BitNet.cpp,正是微软开源的1比特LLM推理框架,它能让你的CPU也能流畅运行百亿参数的巨型模型,这无疑是一场技术的…

Lattice ICE40LP8K开发

一、开发工具: ICEcube2,界面非常原始,只有PLL IP核添加功能,其他IP核貌似只能使用primitive替换。 不支持时序分析、在线仿真等功能。 二、原语使用全局布线资源在 iCE40 FPGA 设备中,有 8 个高驱动缓冲器,称为全局缓冲器(Global Buffers,GBUFx),它们连接到 8 条低偏…

安川YASKAWA工业机器人板卡维修策略

一、安川YASKAWA工业机器人板卡识别故障症状 首先,需要准确识别电路板故障的症状。这通常包括安川YASKAWA机器人操作不稳定、错误代码频繁出现、某些功能失效或整体性能下降等。通过仔细观察和诊断,可以确定问题是否源自电路板。 在工业机器人领域,广州子锐机器人技术有限公…