iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >.NET内存分配方法是什么
  • 826
分享到

.NET内存分配方法是什么

2023-06-17 08:06:29 826人浏览 安东尼
摘要

这篇“.net内存分配方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“.NET内存分配方法是什么”文章吧。在分析内存

这篇“.net内存分配方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“.NET内存分配方法是什么”文章吧。

在分析内存分配时,应该先了解关于堆栈的区别

堆的分配向高地址扩展,而栈的分配向低地址扩展。

一、内存分配

关于内存的分配,首先应该了解分配在哪里的问题。CLR管理内存的区域,主要有三块,分别为:
· 线程的堆栈,用于分配值类型实例。堆栈主要由操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放。栈的执行效率高,但存储容量有限。
· GC堆,用于分配小对象实例。如果引用类型对象的实例大小小于85000字节,实例将被分配在GC堆上,当有内存分配或者回收时,垃圾收集器可能会对GC堆进行压缩,详情见后文讲述。

.NET内存分配方法是什么

public class VIPUser:User       {          //分配1Byte          public bool isVip;          public bool IsVipUser()          {              return isVip;          }           static void Main(string[] args)           {               //分配内存空间和初始化操作               VIPUser aUser;               //将对象引用赋给aUser变量,建立aUser和VIPUser的关联               aUser = new VIPUser();               //Q:类型的分配的字节数?               //就本类而言需要15Byte。但是实例对象所占的字节总数还要加上对象附加成员所需的字节数,其中包括附加成员TypeHandle和SyncBlockIndex共8个字节。在托管堆上分配的字节总数为23字节,而堆上的内存块总是按照4Byte的倍数进行分配,因此本类中将分配24字节的地址空间                  //***调用对象构造器,进行对象初始化操作,完成创建                  //构造过程               //a.构造VIPUser类型的Type对象,主要包括静态字段、方法表、实现的接口等,并将其分配在上文提到托管堆的Loader Heap上。                  //b.初始化aUser的两个附加成员:TypeHandle和SyncBlockIndex。将TypeHandle指针指向Loader Heap上的MethodTable,CLR将根据TypeHandle来定位具体的Type;将SyncBlockIndex指针指向Synchronization Block的内存块,用于在多线程环境下对实例对象的同步操作。                  //c.调用VIPUser的构造器,进行实例字段的初始化。实例初始化时,会首先向上递归执行父类初始化,直到完成System.Object类型的初始化,然后再返回执行子类的初始化,直到执行VIPUser类为止。以本例而言,初始化过程为首先执行System.Object类,再执行User类,***才是VIPUser类。最终,newobj分配的托管堆的内存地址,被传递给VIPUser的this参数,并将其引用传给栈上声明的aUser。                  aUser.isVip = true;               Console.WriteLine(aUser.IsVipUser());               //上述过程,基本完成了一个引用类型创建、内存分配和初始化的整个流程           }       }       public class UserInfo       {           //分配4个字节           private Int32 age = -1;           //分配2个字节           private char level = 'A';       }       public class User       {           //分配4byte           private Int32 id;           //保存了UserInfo的引用 占用4Byte           //仅是一个引用(指针),保存在线程的堆栈上,占用4Byte的内存空间 用于保存user对象的有效地址 现在试图对user的任何操作将抛出NullReferenceException           private UserInfo user;       }

LOH(Large Object Heap)堆,用于分配大对象实例。如果引用类型对象的实例大小不小于85000字节时,该实例将被分配到LOH堆上,而LOH堆不会被压缩,而且只在完全GC回收时被回收。

在了解内存分配之前  首先了解一下三个概念:

  • TypeHandle,类型句柄,指向对应实例的方法表,每个对象创建时都包含该附加成员,并且占用4个字节的内存空间。我们知道,每个类型都对应于一个方法表,方法表创建于编译时,主要包含了类型的特征信息、实现的接口数目、方法表的slot数目等。

  • SyncBlockIndex,用于线程同步,每个对象创建时也包含该附加成员,它指向一块被称为Synchronization Block的内存块,用于管理对象同步,同样占用4个字节的内存空间。

  • NextObjPtr,由托管堆维护的一个指针,用于标识下一个新建对象分配时在托管堆中所处的位置。CLR初始化时,NextObjPtr位于托管堆的基地址。

二、继承本质论

.NET内存分配方法是什么

//Bird bird创建的是一个对象的引用,而new Bird()是创建Bird对象,分配内存和初始化操作,然后将对象引用赋给bird变量,也就是简历bird和Bird 之间的关联  Bird bird = new Bird();  //2.从继承的角度来分析CLR在运行时如何执行对象的创建过程  //2.1 首先是字段的创建 字段的存储顺序由上到下排列,***层类的字段排在最前面  //2.2方法表的创建是类***次加载到AppDomain时完成的,在对象创建时只是将其附加成员TypeHandle指向方法列表Loader Heap上的地址,将对象与其动态方法列表相关联起来,因此方法表示先于对象存在的。    Chicken ch = new Chicken();

以上就是关于“.NET内存分配方法是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: .NET内存分配方法是什么

本文链接: https://www.lsjlt.com/news/288102.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .NET内存分配方法是什么
    这篇“.NET内存分配方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“.NET内存分配方法是什么”文章吧。在分析内存...
    99+
    2023-06-17
  • golang内存分配的方法是什么
    Go语言的内存分配方法主要有两种:静态分配和动态分配。 静态分配:静态分配是指将变量或对象分配在栈上。在编译时,编译器会根据代码...
    99+
    2023-10-25
    golang
  • golang内存分配管理的方法是什么
    Go语言中的内存分配管理主要有两个方法: 垃圾回收:Go语言使用了自动垃圾回收(Garbage Collection)来管理内存...
    99+
    2023-10-26
    golang
  • Java中什么是内存分配
    本篇文章给大家分享的是有关Java中什么是内存分配,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言...
    99+
    2023-06-14
  • c语言内存分配与释放的方法是什么
    在C语言中,内存分配和释放主要有以下几种方法:1. 静态分配:使用静态变量或全局变量来分配内存。静态变量的内存在程序启动时就已经分配...
    99+
    2023-09-23
    c语言
  • DOS下内存的配置方法是什么
    这篇文章主要介绍“DOS下内存的配置方法是什么”,在日常操作中,相信很多人在DOS下内存的配置方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”DOS下内存的配置方法是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-09
  • java数组内存分配的方式是什么
    在Java中,数组是一个对象,它在内存中被分配为连续的内存块。当我们创建一个数组时,Java虚拟机(JVM)会在堆上分配内存来存储数...
    99+
    2023-10-24
    java
  • c语言的内存分配方式是什么
    在C语言中,内存分配主要有以下几种方式:1. 静态内存分配:在程序编译阶段分配内存空间,存储在静态存储区。例如,全局变量和静态变量的...
    99+
    2023-10-12
    c语言
  • Java内存分配指的是什么
    这篇文章主要介绍“Java内存分配指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java内存分配指的是什么”文章能帮助大家解决问题。概念1、内存是计算机的重要原件,临时存储区域,作用是运行...
    99+
    2023-06-30
  • Java内存分配原理是什么
    本篇内容介绍了“Java内存分配原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!String常量池问题的几个例子下面是几个常见例子的...
    99+
    2023-06-17
  • android profiler内存分析的方法是什么
    使用Android Profiler进行内存分析有以下几种方法:1. 实时监测:Android Profiler可以提供实时监测应用...
    99+
    2023-09-15
    android
  • jvm内存分配的策略是什么
    JVM(Java虚拟机)内存分配的策略包括以下几个方面: 静态分配:JVM在启动时会根据预先设置的参数分配一块固定大小的内存给各...
    99+
    2024-02-29
    jvm
  • golang内存分配的原理是什么
    Golang中的内存分配是通过运行时系统来管理的。以下是Golang内存分配的原理: 堆分配:Golang使用一个堆来存储动态分...
    99+
    2023-10-21
    golang
  • .NET内存分配的知识点有哪些
    这篇文章主要讲解了“.NET内存分配的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET内存分配的知识点有哪些”吧!在分析内存分配时,应该先了解关于堆栈的区别堆的分配向高地址...
    99+
    2023-06-17
  • golang中内存分配的原理是什么
    golang中内存分配的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、Linux系统内存在说明golang内存分配之前,先了...
    99+
    2024-04-02
  • Linux内存的分配和释放是什么
    本文小编为大家详细介绍“Linux内存的分配和释放是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux内存的分配和释放是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。了解内存分配机制(共享映射与请...
    99+
    2023-06-16
  • Java中内存分配的原理是什么
    本篇文章给大家分享的是有关Java中内存分配的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。JAVA内存分配与管理是Java的核心技术之一,一般Java在内存分配时会...
    99+
    2023-06-17
  • redis分布式共享内存的方法是什么
    Redis分布式共享内存的方法主要有以下几种:1. Redis Cluster:Redis Cluster是Redis官方推出的分布...
    99+
    2023-08-23
    redis
  • Java内存分配与回收机制是什么
    本篇内容介绍了“Java内存分配与回收机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一.运行时数据区域下图是Java虚拟机运行时的...
    99+
    2023-06-03
  • golang内存分配的方法有哪些
    在Go语言中,内存分配的方法主要有以下几种: 堆分配:当使用`new`关键字或`make`函数创建对象时,Go语言会在堆上分配内...
    99+
    2023-10-27
    golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作