简介

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的托管堆结构



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

眼见为实----堆结构

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

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

  2. 它们的GC 引用根



    三个静态数据都引用了同一个gcroot

  3. GC根分配在LOH

.NET 5的托管堆结构

大家可以思考一个问题,LOH堆的定义是指>=85000byte的大对象才会进入的堆。而静态数据只是利用了LOH的特性,但本质与LOH描述不符,属于投机取巧的行为。也会给开发者带来困扰,比如说我。

因此在.NET 5 以后,CLR开发人员新增了一个Pinned object heap ,用于存储固定对象的特殊堆。来解决定义不匹配的问题

眼见为实----POH

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

.NET 8的托管堆结构

到了.NET 8 中,CLR团队又新增了NonGC heap ,顾名思义,这代表一个不会被GC的托管堆。很奇怪吧?

那有人就有疑问了? POH堆不是已经完美了吗?为什么还要新增堆?CLR团队给出了答案



主要是为了提高性能,没有写屏障,没有GC。这大大提高了效率

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

眼见为实----NonGC heap

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

结论

因此大家在参考市面上的书籍时,切记知行合一,眼见为实。 否则用过时的知识去分享就贻笑大方啦

管中窥豹----从String Intern中观察.NET Core到.NET 8 托管堆的变迁的更多相关文章

  1. Java提高篇——理解String 及 String.intern() 在实际中的应用

    1. 首先String不属于8种基本数据类型,String是一个对象.   因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ...

  2. Java String类中的intern()方法

    今天在看一本书的时候注意到一个String的intern()方法,平常没用过,只是见过这个方法,也没去仔细看过这个方法.所以今天看了一下.个人觉得给String类中加入这个方法可能是为了提升一点点性能 ...

  3. 字符串常量池和String.intern()方法在jdk1.6、1.7、1.8中的变化

    字符串常量池也是运行时常量池 jdk1.6中,它是在方法区中,属于“永久代” jdk1.7中,它被移除方法区,放在java堆中 jdk1.8中,取消了“永久代”,将常量池放在元空间,与堆独立了 pub ...

  4. 运行时常量池中的符号引用/String.intern() /ldc指令

    运行时常量池,之前放在方法区(永久代)中,1.8之后被转移到元空间,放到了native memory中. 具体的数据结构是:(看对象的内存布局,句柄访问还是对象头中保存指向类的元数据的指针,这里以对象 ...

  5. String intern 方法 jdk中的描述

    一个初始为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中 ...

  6. 对于JVM中方法区,永久代,元空间以及字符串常量池的迁移和string.intern方法

    在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表. 在过去(当自定义类加载器使用不普 ...

  7. 关于jvm中的常量池和String.intern()理解

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  8. Java (JDK7)中的String常量和String.intern的实现

    在java中有constantPool常量池,常量池里存放的是类,方法,接口的等常量,而对于存放字符串常量通常存放的符号链接Symbol 或者真实的String的对象的引用. 我们来看一段简单的代码和 ...

  9. String类中intern方法的原理分析

    一,前言 ​ 昨天简单整理了JVM内存分配和String类常用方法,遇到了String中的intern()方法.本来想一并总结起来,但是intern方法还涉及到JDK版本的问题,内容也相对较多,所以今 ...

  10. 结合字符串常量池/String.intern()/String Table来谈一下你对java中String的理解

    1.字符串常量池 每创建一个字符串常量,JVM会首先检查字符串常量池,如果字符串已经在常量池中存在,那么就返回常量池中的实例引用.如果字符串不在池中,就会实例化一个字符串放到字符串池中.常量池提高了J ...

随机推荐

  1. 如何让您的 .NET应用程序更智能-- 请参加 8.20 的 .NET Conf -- Focus on AI

    Microsoft 将于 2024 年 8 月 20 日举办免费的 .NET Conf: Focus on AI.该虚拟活动为开发人员提供了如何集成 .NET 和 AI 以增强应用程序开发和用户体验的 ...

  2. Docker高级篇:实战Redis集群!从3主3从变为4主4从

    通过前面两篇,我们学会了三主三从的Redis集群搭建及主从容错切换迁移,随着业务增加,可能会有主从扩容的,所以,本文我们来实战主从扩容 PS本系列:<Docker学习系列>教程已经发布的内 ...

  3. ComfyUI 基础教程(二) —— Stable Diffusion 文生图基础工作流及常用节点介绍

    上一篇文章讲解述首次启动 ComfyUI 会自动打开一个最基础的文生图工作流.实际上,后续我们可以通过菜单选项,或者快捷键 ctrl + D来打开这个默认工作流.默认工作流如下: 这是一个最基础的文生 ...

  4. c程序设计语言 by K&R(五)UNIX系统接口

    一.文件描述符 在unix操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统的文件,因此,所有的输入.输出都要通过读/写文件来完成.也就是说,通过一个单一的接口就可以处理外围设备和程序之 ...

  5. BOOST <boost/asio.hpp> 奇怪的编译错误 boost/asio/detail/consuming_buffers.hpp:105:65: error

    在我的项目工程代码内#include <boost/asio.hpp>后导致了编译报错: ./include/boost/asio/detail/consuming_buffers.hpp ...

  6. 第16天:信息打点-CDN绕过&业务部署&漏洞回链&接口探针&全网扫描&反向邮件

    #CDN配置: 配置1:加速域名-需要启用加速的域名 配置2:加速区域-需要启用加速的地区 配置3:加速类型-需要启用加速的资源 #参考知识: 超级Ping:http://www.17ce.com/ ...

  7. ROS基础入门——实操教程

    ROS基础入门--实操教程 前言 本教程实操为主,少说书.可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记. Ruby Rose,放在这里相当合理 前言 ...

  8. C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  9. 随心所动,厂商的CPU核管理策略介绍

    一.引文 随着CPU架构的发展,工艺的升级,带来性能提升,能效的提升(同性能下).但是由于极限性能的增加,也带来了peak功耗的增加(大部分情况下,能效比的提升无法抵消这部分),CPU功耗优化一直是广 ...

  10. 三维医学图像深度学习,数据增强方法(monai):RandHistogramShiftD, Flipd, Rotate90d

    #coding:utf-8 import torch from monai.transforms import Compose, RandHistogramShiftD, Flipd, Rotate9 ...