首页 > 其他分享 >管中窥豹----.NET Core到.NET 8 托管堆的变迁

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

时间:2024-10-31 11:57:52浏览次数:1  
标签:静态数据 Core ---- LOH 管中窥豹 眼见为实 NET NonGC

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的过程中走了不少弯路。
因此大家在参考市面上的书籍时,切记知行合一,眼见为实。 否则用过时的知识去分享就贻笑大方啦

标签:静态数据,Core,----,LOH,管中窥豹,眼见为实,NET,NonGC
From: https://www.cnblogs.com/chinasoft/p/18517447

相关文章

  • BitNet.cpp:革新性的1比特LLM推理框架,让CPU也能驾驭百亿参数大模型!
    ......
  • 会员权益上新: OneThingAI 算力云给园子会员送算力
    和厂商合作给会员送福利,是我们拓展会员权益的一个方向。最近我们和算力云服务商OneThingAI达成了合作,OneThingAI给园子的会员提供了不少代金券,让大家免费体验一下OneThingAI的算力服务。OneThingAI是一家提供AI场景解决方案的算力云服务商,提供了适合AI推理的强大且经济高......
  • 推荐一个 ASP.NET Core 的轻量级插件框架
    前言本文将介绍一个专为ASP.NETCore设计的轻量级插件框架——PluginCore,该框架不仅能够简化插件的开发与集成,还能大幅提高开发效率。另外,还将简要介绍相关的前端技术和SDK支持,帮助我们快速上手。项目介绍PluginCore是一个轻量级插件框架,通过最小化的配置简化插件的集成与管理......
  • 实现.NET 4.0下的Task类相似功能组件
    实现.NET4.0下的Task类相似功能:TaskExCum组件详解引言随着.NET技术的发展,异步编程模型逐渐成为现代应用程序开发中的标准实践之一。.NET4.5引入了Task类,极大地简化了异步编程的过程。然而,许多遗留系统仍在使用.NET4.0或更低版本,这些版本并未直接支持Task类的全......
  • 什么是Internet 和 Internet的性能指标
    Internet和它的性能指标请时刻注意,Internet也是网络,它是一些相互连接的节点的集合。互联网(Internet)从宏观上看,它是一个由软件与硬件的集合组成的分布式系统。这个系统主要为用户提供的服务就是通信。互联网的组成硬件:一些物理链路(用于连接)和用于通信的硬件节点(路由器......
  • 计算机网络(们)和 Internet (计算机网络的子类)
    计算机网络101计算机网络,属于网络的一种。网络通常指由多个节点和它们之间的连接关系构成的结构,强调连接、交互和通信。说明网络的主要目的是通信(交流)(通信)历史以前使用广播,不管是物理的还是无线电广播。特点:强调的是信息的单向传递。用户只能接收信息,而不能实时反馈。(这......
  • Apache Commons Net 共享SSLSession问题解决
        某些服务器会默认开启TLS会话恢复,如FileZillaServer1.0及以后的版本(相对于1.0以前版本就是先当与勾选了RequireTLSsessionresumptionondataconnectwhenusingPORTP)。ApacheCommonsNet目前是不支持TLS会话恢复的,所以我们只能通过重写FTPSClient来实现。不然你......
  • dotnet core微服务框架Jimu ~ 会员授权微服务
    提供授权服务,用户使用会员的用户名和密码获取token,带着token访问受保护的接口,如浏览和发布新闻。有2个公开的api:token:获取token;GetCurrentMemberInfo:获取当前token的会员信息;有1个不公开的方法:GetMemberInfo:根据会员用户名和密码,获取会员信息,该方法供......
  • CSCI 201 Networked Crossword Puzzle
    Assignment#2CSCI201Fall2024Page1of11Assignment#2CSCI201Fall20246%ofcoursegradeTitleNetworkedCrosswordPuzzleTopicsCoveredNetworkingMulti-ThreadingConcurrencyIssuesIntroductionThisassignmentwillrequireyoutocreatetwodiffe......
  • 管中窥豹----从String Intern中观察.NET Core到.NET 8 托管堆的变迁
    简介https://www.cnblogs.com/lmy5215006/p/18494483在研究.NETString底层结构时,我所观察到的情况与《.NETCore底层入门》,《.NET内存管理宝典》书中描述不符。故多研究了一下。发现.NET托管堆的结构也是越来越多,越来越高性能。 //示例代码internalclassProgram{......