http://my.oschina.net/lichaoqiang/blog/291906

当我们对.NET Framework的一些基本面了解之后,实际上,还是很有必要了解一些更底层的知识。比如.NET Framework是如何进行内存管理的,是如何垃圾回收的......这样,我们才能写出更高性能的程序。

在.NET Framework中,有2个地方帮我们保存管理数据:一个是"堆",也叫"托管堆",由.NET Framework的垃圾收集器(Garbage Collection, GC)管理;另一个是"栈",也叫"线程堆栈",由操作系统直接管理。它们都寄宿在操作系统内存。

本篇主要包括:
■  什么是"栈"
■  什么是"堆"
■  值类型内存分配
    ※  在方法内的值类型内存分配
    ※  在引用类型内部的值类型内存分配
■  练习题

什么是"栈"

可以把"栈"想像成由下而上堆叠起来的盒子,值类型实例存储于此。

在 应用程序中,每当调用一个方法,就相当于在"堆"上放上了一个盒子A,这时,应用程序只能使用处在"栈"最上方、刚被放上的这个盒子A,当方法执行结束, 相当于把最上方的盒子A扔掉。接下来,刚才还在A下面的盒子B就处在"栈"的最上方了,于是应用程序又开始使用盒子B,以此类推。而且,每当把最上面的盒 子扔掉,其对应的内存也被自动释放。

栈的优点是执行效率高,缺点是存储容量有限。

在.NET Framework中,所有派生于System.ValueType的就是值类型,值类型实例位于"栈"。值类型包括:
● bool
● byte
● char
● decimal
● double
● enum
● float
● int
● long
● sbyte
● short
● stuct
● uint
● ulong
● short

什么是"堆"

可以把"堆"想像成一些摆放无序的盒子,引用类型实例存储于此。

我们可以在任何时候,使用任何盒子。我们需要借助垃圾收集器(Garbage Collection, GC)的自动回收机制或手动处理,以保证"堆"的盒子被及时回收。

另 外,根据引用类型实例的大小,"堆"分为"GC堆"和"LOH(Large Object Heap)堆",当引用类型实例大小小于85000个字节的时候,实例被分配在"GC堆"上;当实例大小大于或等于于85000个字节的时候,实例被分配 在"LOH(Large Object Heap)堆"。

在.NET Framework中,所有派生于System.Object的就是引用类型,引用类型实例位于"堆"。引用类型包括:
● 类 class
● 接口 interface
● 委托 delegate
● object
● string

值类型内存分配

在方法内的值类型内存分配

public int Add(int x)
{    int result;
    result = x + 2;    return result;
}

1、在执行Add(int x)方法之前,方法参数x被存放到"栈"的顶部。

2、在"method table"中搜寻Add()方法,如果找不到,就让JIT及时编译再存放到"method table"中去。

3、开始执行Add(int x)方法,局部变量result也需要"栈"中的一些内存。

4、当方法执行完毕,先释放result,再释放x,线程堆栈指针重新指向。

在引用类型内部的值类型内存分配

public class MyClass
{    public int MyValue;
}public MyClass Add(int x)
{
    MyClass result = new MyClass();
    result.MyValue = x + 2;    return result;
}

1、在执行Add(int x)方法之前,方法参数x被存放到"栈"的顶部。

2、在"method table"中搜寻Add()方法,如果找不到,就让JIT及时编译再存放到"method table"中去。

3、开始执行Add(int x)方法,执行MyClass result = new MyClass()
先在托管堆上创建一个MyClass的实例,然后在栈上开辟一块空间并指向实例地址。

4、当方法执行完毕,在栈中由上到下依次释放内存。

此时,在托管堆上的MyClass实例如何处理呢?

5、此时,垃圾回收器登场了,他在托管堆中搜寻那些不再被引用的对象实例,然后实施回收。

C#学习笔记----栈与堆的知识的更多相关文章

  1. HTML+CSS学习笔记 (7) - CSS样式基本知识

    HTML+CSS学习笔记 (7) - CSS样式基本知识 内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌 ...

  2. Python基础教程学习笔记:第一章 基础知识

    Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...

  3. 大数据学习笔记——Java篇之基础知识

    Java / 计算机基础知识整理 在进行知识梳理同时也是个人的第一篇技术博客之前,首先祝贺一下,经历了一年左右的学习,从完完全全的计算机小白,现在终于可以做一些产出了!可以说也是颇为感慨,个人认为,学 ...

  4. 受限玻尔兹曼机(RBM)学习笔记(一)预备知识

    去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算法原 ...

  5. HTTPS学习笔记一----HTTPS的基础理论知识

    首先推荐一本书,<HTTP权威指南>我就是看这本书入门的,对http协议有了更好的理解,学习https的理论知识我认为需要了解以下几点,需要一步步的深入学习: 1.HTTPS的基本概念? ...

  6. Java学习之栈和堆的区别

    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配 ...

  7. PMBOK(第五版)学习笔记二-十大知识领域(P87)

    五大项目管理过程组:启动.规划.执行.监控.收尾过程组 十大知识领域是:项目整合管理.项目范围管理.项目时间管理.项目成本管理.项目质量管理.项目人力资源管理.项目沟通管理.项目风险管理.项目采购管理 ...

  8. Ant学习笔记(1) 基础知识

    Ant Apache Ant 是一个基于 Java的构建工具. 下载Ant google.baidu.Windows用户下载zip格式.解压即可. Windows安装Ant Ant本质上是一个Java ...

  9. Java学习笔记--PriorityQueue(优先队列)(堆)

    PriorityQueue(优先队列)实际上是一个堆(不指定Comparator时默认为最小堆)队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设置排序规则.队列的头是按指定排序 ...

随机推荐

  1. iOS开发——高级篇——Objective-C特性:Runtime

    Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发.下面通过分析Apple开源的 ...

  2. leetcode 100. Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  3. 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

    面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END

  4. ndk学习19: 使用Eclipse调试so

    1.  设置调试选项 在AndroidManifest文件加入允许调试 android:debuggable="true"   此时编译项目会多出: 2.  配置调试代码 把需要调 ...

  5. 数据库Error:The ScriptCollection in ScriptName not find

    System.InvalidOperationException: The ScriptCollection in ScriptName not find 在 WMI.SQL.HELPER.CONFI ...

  6. cf219d

    树形dp #include <cstdio> #include <vector> using namespace std; #define D(x) const int INF ...

  7. Unity3d 换装Avatar系统

    原理就是用新造的部件和角色的骨骼进行重新对接. demo的使用方法: PartIdx设置要换那个部件[0,4],一共5个部件 EquipIdx设置要更换部件的装备索引[0,1],具体看我的Change ...

  8. ffmpeg-20160714-git-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...

  9. Linux(CentOS、Ububtu)一键安装Openstack及其它参考文档汇总

    原文链接  http://www.aboutyun.com/thread-10920-1-1.html openstack相关资料 CentOS下一键安装Openstack  http://blog. ...

  10. java转换json需要导入的jar包,org/apache/commons/lang/exception/NestableRuntimeException

    缺少相应jar包都会有异常,根据异常找jar包导入......     这里我说下lang包,因为这个包我找了好半天:   我用的是: commons-lang3-3.1.jar  出现异常: jav ...