在分析内存分配时,应该先了解关于堆栈的区别
堆的分配向高地址扩展,而栈的分配向低地址扩展。
一、内存分配
关于内存的分配,首先应该了解分配在哪里的问题。CLR管理内存的区域,主要有三块,分别为:
· 线程的堆栈,用于分配值类型实例。堆栈主要由操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放。栈的执行效率高,但存储容量有限。
· GC堆,用于分配小对象实例。如果引用类型对象的实例大小小于85000字节,实例将被分配在GC堆上,当有内存分配或者回收时,垃圾收集器可能会对GC堆进行压缩,详情见后文讲述。
- publicclassVIPUser:User
- {
-
-
publicboolisVip;
-
publicboolIsVipUser()
- {
-
returnisVip;
- }
-
staticvoidMain(string[]args)
- {
-
- VIPUseraUser;
-
-
aUser=newVIPUser();
-
-
-
-
-
-
-
-
-
-
-
-
-
aUser.isVip=true;
- Console.WriteLine(aUser.IsVipUser());
-
- }
- }
-
publicclassUserInfo
- {
-
-
privateInt32age=-1;
-
-
privatecharlevel='A';
- }
-
publicclassUser
- {
-
-
privateInt32id;
-
-
-
privateUserInfouser;
- }
LOH(Large Object Heap)堆,用于分配大对象实例。如果引用类型对象的实例大小不小于85000字节时,该实例将被分配到LOH堆上,而LOH堆不会被压缩,而且只在完全GC回收时被回收。
在了解内存分配之前 首先了解一下三个概念:
-
TypeHandle,类型句柄,指向对应实例的方法表,每个对象创建时都包含该附加成员,并且占用4个字节的内存空间。我们知道,每个类型都对应于一个方法表,方法表创建于编译时,主要包含了类型的特征信息、实现的接口数目、方法表的slot数目等。
-
SyncBlockIndex,用于线程同步,每个对象创建时也包含该附加成员,它指向一块被称为Synchronization Block的内存块,用于管理对象同步,同样占用4个字节的内存空间。
-
NextObjPtr,由托管堆维护的一个指针,用于标识下一个新建对象分配时在托管堆中所处的位置。CLR初始化时,NextObjPtr位于托管堆的基地址。
二、继承本质论
-
Birdbird=newBird();
-
-
-
-
Chickench=newChicken();
原文链接:http://www.cnblogs.com/cheshui/archive/2012/09/29/2707910.html
分享到:
相关推荐
jemalloc.NET是基于本机内存分配器的.NET API,可为.NET应用程序提供由本机内存支持的高效数据结构,适用于大规模内存计算方案。 jemalloc是“通用的malloc(3)实现,它强调避免碎片和可扩展的并发支持”,已在...
MPMCQueue.NET 有界的多个生产者,多个消费者排队等待.NET ... 操作期间无动态内存分配/管理。 生产者和使用者是彼此分开的(如在两锁队列中),即在队列不为空时不要触摸相同的数据。 实作 队列类
动态内存分配器维护者一个进程的虚拟内存区域堆,每个块就是一个连续的虚拟内存片,已分配的块显式的保留为供应用程序使用,空闲块可用来分配。空闲块保持空闲,直到它显示的被应用所分配。一个已分配的块保持已分配...
介绍。net中对象的创建,以及内存的分配。讲得很好。
.NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...
侧重讲解VS的历史,VC++和托管C++
内存分配检测整理了一下本人硬盘里实用的编程资料和源码,全部是VB代码,希望大家能喜欢.
一般使用malloc和free动态开内存时,容易造成内存碎片,使用内存池可以解决内存碎片问题
新的IO组件在处理磁盘中的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件...
19.ASP.net的身份验证方式有哪些?分别是什么原理? 答:10。...答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。 ..........................
21.在.net中,配件的意思是? 答:程序集。(中间语言,源数据,资源,装配清单) 22.常用的调用WebService的方法...答:Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的.
掌握首次适应算法、循环适应算法、最坏适应算法、最佳适应算法的内存分配过程。掌握内存回收的策略。 1、首次适应算法(First Fit) 将空闲分区链以地址递增的顺序连接;在进行内存分配时,从链首开始顺序查找,直到...
这是的改进版本,是一种内存分配器,旨在处理繁重的多线程方案中的许多小分配/取消分配。 该分配器是为在性能至关重要的应用程序(例如视频游戏)中使用而创建的。 在.NET环境中使用smmalloc分配器有助于最大程度地...
.net实际上封装了操作系统的部分功能,如文件处理和内存分配,这就为软件的移植奠定了良好的基础。 .net总体分为三层体系结构,底层是公共语言运行库(CLR),它是.net的核心,是驱动关键功能的引擎,它包括数据...
查询时临时内存分配数量大幅下降,查询速度特别是 Contains 的查询速度大幅提高,多关键字情况下精确查询的速度提高了5倍以上。 从这个版本开始,索引结构将不再做重大调整,除非我发现了更加高效的算法。各位组员...
程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。 C 风格的内存分配程序 C 编程语言提供了两个函数来...
冰镇 iced是一种快速,正确的...110 MB / s(Rust, ) :check_mark: 较小的解码指令,只有40个字节,并且解码器不分配任何内存 :check_mark: .NET:提供简单且精简语法的高级汇编器(例如, asm.mov(eax, edx) ))
无论学习.net多长时间,我们是否对.net了解,而又了解多少?继承?封装?多态?...内存分配?堆栈... 如果想学好.net,应该对.net有一个系统的认识和理解。在此,把《.net必须知道的》一书献给大家。
内存分配算法代码模拟。包含 首次适应算法(First Fit) 最佳适应算法(Best Fit)最差适应算法(Worst Fit)伙伴算法(buddy) https://blog.csdn.net/GreyBtfly/article/details/84646981
由于.NET对String类型变量的独特管理...本文分几个方面来说:了解String数据的内存分配方式、尽量少使用字串加法运算符、避免使用加法运算符连接不同类型的数据、在循环中使用StringBuilder代替String实现字串连接。