C#自动内存分配
一、在程序运行时由CLR管理内存分配(Memory Allocation),程序启动时,操作系统会为每一个线程申请一个独立的栈内存,用于存储方法的局部变量、参数和返回值等;CLR会为进程申请一个连续的内存空间作为托管堆内存,用于存储引用类型对象和类型对象等;
1.托管堆主要包含两部分:存储引用类型对象的GC堆(GC Heap)和存储类型对象的加载堆(Loader Heap),其中GC堆分为小对象堆(Small Object Heap,SOH,<85000byte的对象)和大对象堆(Larage Object Heap,LOG,>=85000byte的对象);加载堆不受GC控制,生命周期从创建到应用程序域被卸载;
2.CLR在申请托管堆内存时,会维护一个指向下一个对象内存地址的指针,当在托管堆中分配新对象时,会通过该指针添加值来为对象分配所需的内存,因此在托管堆中分配内存和在栈内存中分配内存的速度基本一样快;
二、在栈上分配值类型的变量时,如果值类型所占的空间不足当前系统的位数时,会分配当前系统位数的内存空间,例如在64位系统上分配的int类型的变量占用64位,即8个字节;对于引用类型地址也是这样,即32位系统上引用类型地址占用4个字节,64位系统上则占用8个字节;
//在64位系统上测试:
unsafe
{
int num1 = ;
int num2 = ;
MyClass myClass = new MyClass();
int num3 = ;
Console.WriteLine((int)&num1);
Console.WriteLine((int)&num2); //与num1地址相差8个字节
Console.WriteLine((int)&num3); //与num2地址相差16个字节
}
三、在使用运算符new创建引用类型对象或装箱操作等在托管堆上创建对象时,CLR所做的主要操作有:
1.计算类及所有基类中声明的所有实例字段所需要的字节数,还有两个开销成员(Overhead Member)的字节数:同步块索引(Sync Block Index)和类型对象指针(Type Object Pointer);
※同步块索引为线程同步提供支持,也被称为对象头字节(Object Header Word);
※类型对象指针存储该对象的类型对象所在的内存地址,也被称为方法表指针(Method Table Pointer);
2.从托管堆中分配计算所得到的字节数,所有字节初始化为0;
3.初始化对象的类型对象指针和同步块索引;
4.调用对应的实例构造函数,初始化实例字段,执行自定义构造函数中的其它操作;
※优先调用直接基类中的实例构造函数,直接基类中的实例构造函数又会调用其直接基类中的实例构造函数,最终最先调用的是基类System.Object中的实例构造函数;
5.返回新建对象的引用;
注:32位系统中,同步块索引和类型对象指针分别占4个字节,占用的总空间大小会进行4字节倍数的对齐,同时即使类型定义中没有实例字段,也会至少占用4个字节,即最小占用内存空间12字节;
注:64位系统中,同步块索引和类型对象指针分别占8个字节,占用的总空间大小会进行8字节倍数的对齐,同时即使类型定义中没有实例字段,也会至少占用8个字节,即最小占用内存空间24字节;
注:CLR在托管堆中连续分配多个对象时,这些对象在内存中也是连续存储的;
注:可以使用WinDbg查看具体的内存分配情况;
注:CLR高度优化了托管堆上内存的分配和释放,大多数情况下,在堆内存上分配类实例与在栈内存上分配结构实例的性能并无显著差异;
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!
作者:Minotauros
出处:https://www.cnblogs.com/minotauros/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
C#自动内存分配的更多相关文章
- 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这 ...
- 自动内存管理算法 —— 标记和复制法
最近阅读了<垃圾回收算法手册>这本经典的书籍,借此机会打算写几篇内存管理算法方面的文章,也算是自己的总结吧. ...
- Java自动内存管理机制学习(二):垃圾回收器与内存分配策略
备注:本文引自<深入理解Java虚拟机第二版>仅供参考 图片来自:http://csdn.net/WSYW126 垃圾收集器与内存分配策略 概述 GC要完成3件事: 哪些内存需要回收? 什 ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.3.垃圾收集器与内存分配策略
1.学习目的 当需要排查各种内存溢出. 内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节. Java内存运行时区域的各个部分,其中程序计数 ...
- C语言内存分配方法。
当C程序运行在操作系统上时,操作系统会给每一个程序分配一定的栈空间. 堆为所有程序共有的,需要时需要申请访问. 一.栈 局部变量.函数一般在栈空间中. 运行时自动分配&自动回收:栈是自动管理的 ...
- 小白请教几个关于Java虚拟机内存分配策略的问题
最近在看周志明所著的<深入理解Java虚拟机>,有几个问题不太明白,希望对虚拟机有研究的哥们儿帮我解答一下.先说一下我进行试验的环境: 操作系统:Mac OS X 10.11.6 EI C ...
- java中内存分配策略及堆和栈的比较
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...
- C语言内存分配
(1)代码区(text segment).存放CPU执行的机器指令(machine instructions).通常,代码区是可共享的 (即另外的执行程序可以调用它),因为对于频繁被执行的程序,只 ...
- C标准库-数值字符串转换与内存分配函数
原文链接:http://www.orlion.ga/977/ 一.数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); dou ...
随机推荐
- FIRST集合、FOLLOW集合、SELECT集合以及预测分析表地构造
FIRST集合.FOLLOW集合.SELECT集合以及预测分析表地构造 FIRST集合的简单理解就是推导出的字符串的开头终结符的集合. FOLLOW集合简单的理解就对于非终结符后面接的第一个终结符. ...
- POJ 2096 找bug 期望dp
题目大意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcompon ...
- 【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students
http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] #include<iostream> #include<cstdio&g ...
- android 实现照相功能 照片存放在SID卡中,将照片显示在Image中
protected static final int CAMERA_RESULT = 0; private String fileName; private Button takePhotoBn; p ...
- Delphi XE4 inline 的用法
为了提高应用程序的性能,可以用inline声明一个函数过过程,对于声明为inline的过程,编译器在编译时,会取代正常的过程调用方式,取而代之是直接把这个函数的编译代码拿过来生成到调用该过程的地方,有 ...
- Windows 10+Ubuntu 16.04在MBR分区上安装双系统之后没有Windows 10的启动菜单解决方法
背景: 硬盘分区方式:MBR 硬盘容量256,Windows 100,Ubuntu 156,其中主分区安装的是Windows,Ubuntu安装在逻辑分区上,文件系统为Ext4,整个Ubuntu就挂载在 ...
- Eclipse配色方案插件 真漂亮!
原文:https://my.oschina.net/jean/blog/208263 最近发现了一个Eclipse配色方案插件,这回给Eclipse配色太方便了. 插件主页:http://eclips ...
- zip4j加密压缩、解压缩文件、文件夹
原文:http://blog.csdn.net/k21325/article/details/54376188 1.首先,引用到zip4j的第三方类库,感谢作者的无私奉献,官网打不开,这里就不贴了,下 ...
- 关于warning
IT男正吸着雪茄,吐着烟圈.他女朋友生气了发飙道:“你没看见包装盒上的警告(Warning)么?吸烟有害健康!” IT男淡定地回答道:“我是程序员.我们不关心警告,只关心错误.”
- iphone的ibooks如何导入pdf?
使用QQ把pdf文档从电脑上发到手机上,使用手机的QQ打开文档,在手机QQ上,用其他应用打开文档,选择‘拷贝’到ibooks