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开发——UI进阶篇(六)键盘处理

    一.键盘通知我们经常需要在键盘弹出或者隐藏的时候做一些特定的操作,因此需要监听键盘的状态 键盘状态改变的时候,系统会发出一些特定的通知UIKeyboardWillShowNotification // ...

  2. Android6.0以后动态增加权限

    private void test() throws IOException { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { in ...

  3. pro*c添加SQLCHECK后编译报错PLS-S-00201

    如果在pro*c中调用数据库了里的函数,就需要在proc的cfg配置文件中添加一行: SQLCHECK=SEMANTICS 但是添加之后又会出现PLS-S-00201错误,原因在与添加SQLCHECK ...

  4. BZOJ 2466: [中山市选2009]树

    Sol 树形DP. 听说有非常神奇的高斯消元的做法...orz... 然而我只会 \(O(n)\) 的树形DP. 首先一个点的状态只于他的父节点和子树有关,跟他 子树的子树 和 父亲的父亲 都没有任何 ...

  5. 新塘ARM平台交叉编译minigui界面库

    简介 MiniGUI 是一款面向嵌入式系统的高级窗口系统(Windowing System)和图形用户界面(Graphical User Interface,GUI)支持系统,由魏永明先生于 1998 ...

  6. django rest framework 的url标签的问题

    如何在模板中引用一个在rest framework中的url? urls.py from django.conf.urls import patterns, url from .views impor ...

  7. bootstrap常用的定义风格

    primary()     首选项 success()     成功 info()        一般信息 warning()       警告 danger()         危险 <bod ...

  8. SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

    在用php返回json数据的时候如果出现这种错误,先检查一下php中是否有使用var_dump()函数 这个函数会在页面输出测试变量的结构,浏览器会将这个当做json数据,所以就报错了....

  9. 【GoLang】深入理解slice len cap什么算法? 参数传递有啥蹊跷?

    先上结论 .内置append函数在现有数组的长度 < 时 cap 增长是翻倍的,再往上的增长率则是 1.25,至于为何后面会说. .Go语言中channel,slice,map这三种类型的实现机 ...

  10. 【云计算】qcow2虚拟磁盘映像转化为vmdk

    Software QEMU emulator version 1.7.0 Introduction Since we use VmWare in my company, I started to pl ...