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

管中窥豹----从String Intern中观察.NET Core到.NET 8 托管堆的变迁

时间:2024-10-30 16:44:47浏览次数:5  
标签:静态数据 ---- LOH 管中窥豹 眼见为实 NET NonGC

简介

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

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

相关文章

  • Oracle数据库AWR报告中高等待事件优化方法
    一、理解等待事件什么是等待事件在Oracle数据库中,等待事件是指会话在执行SQL语句时,由于某些资源(如磁盘I/O、锁、缓冲区等)暂时不可用而必须等待的情况。AWR报告中的等待事件部分可以帮助我们识别数据库性能瓶颈的关键所在。确定高等待事件类型常见的高等待事件包括:......
  • 2024年强势推荐!最经典4款最适合工程项目的免费管理平台
    一、工程项目管理平台的重要性工程项目管理具有复杂性高、周期长、资源要求多样、协调性强等特点。复杂性体现在涉及多个专业领域协同工作,需遵循严格法律法规和标准,且各个阶段都需要详细计划和协调。例如,一个大型工程项目可能需要土木、电气、机械等多个专业人员合作,每个领域都有......
  • USB E-Maker用途
    E-Marker是“ElectronicallyMarkedCable”的缩写,是封装在USB-C端口中的芯片。通过这个芯片,可以得到电缆的各种参数,包括功率、数据、视频传输、ID等信息。由于Type-C设备之间的功能差异很大,因此在决策过程中考虑电缆至关重要。例如,如果源和接收设备都需要100W的功率,但电......
  • 使用OpenSSL生成SANs证书实操
    当初:原来的x.509证书,生成就一行代码,非常方便:opensslreq-x509-nodes-days365-newkeyrsa:2048-keyoutkey.pem-outcert.pem然后按照提示输入机构和dns信息即可。 然而:最近在开发一个websocket项目时,需要使用wss协议,在机器A(win7)上调试没问题,在机器B(win10+go1.22.3......
  • shellcode编写实验
       作业题目shellcode广泛用于许多涉及代码注入的攻击中。编写shellcode是相当有挑战性的。虽然我们可以很容易地从互联网上找到现有的shellcode,但是能够从头开始编写我们自己的shellcode总是令人兴奋的。shellcode中涉及到几种有趣的技术。本实验室的目的是帮助学生理解这......
  • CF1187题解
    前言这套题相对来讲难度不算高,并且质量也很好,建议尝试CF1187A一眼秒,但我没有考虑s,t只有这一种排列方式,所以取一下\(max(n-s,n-t)\)#include<bits/stdc++.h>usingnamespacestd;intT,n,s,t;intmain(){ scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&s,&t)......
  • 日常 23
    HTML(超文本标记语言)是用于创建网页的标准标记语言。基本结构html页面标题欢迎来到我的网页这是一个段落常用标签:至:分别表示不同级别的标题,最重要,最不重要。html副标题段落::用于定义一个段落。链接:链接文本:创建一个超链接。图像::插入图像。列表:无序列表:与有序列......
  • Array and string offset access syntax with curly braces is deprecated
    你遇到的这个问题确实是因为PHP版本升级后对一些语法的支持发生了变化。具体来说,从PHP7.4开始,使用大括号 {} 访问数组和字符串的偏移已经被弃用,并将在未来的版本中完全移除。因此,你需要对代码进行相应的调整。解决方法方法一:降级PHP版本更改PHP版本为7.0以下的版本:如果你......
  • 环境变量与set-uid实验
       作业题目本实验室的学习目标是让学生了解环境变量如何影响程序以及系统行为。环境变量是一组动态命名值,可以影响正在运行的进程将在计算机上运行。大多数操作系统都使用它们,因为它们是1979年引入Unix。尽管环境变量会影响程序行为,但它们是如何实现的这一点很多程序员都......
  • 关于测度理论相关术语的注释(啊终于接受了hh)
    最开始听拓扑课的时候,一直无法理解,明明看拓扑空间定义,\(\tau\)才是拓扑空间的根本,它包含基本集\(X\)构成了拓扑空间啊,为什么所有题目开头第一句“在拓扑空间X上”好,我告诉自己接受就好。后来测度空间,我的学习大头...\((X,\mathcal{M},\mu)\),多么直观和美妙的书写,一个基本集,一个......