C#学习笔记----栈与堆的知识

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

时间: 2024-11-09 07:28:46

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

加壳学习笔记(一)-基础知识

1.预备知识 1.关于栈,在windows里面的堆栈其实很简单,当学了才知道哈,呵呵,第一要记住的是windows里面的栈是向低地址生长的(extended,延伸,呵呵,顺便丰富下英语的单词量,确实是少的可怜),你可以这样认为,栈就像是一个倒立的箱子,箱子的口子是向下的,底是向上的,这里就表明了系统栈的分布也是延伸方向是由高地址向低地址extended,在最初的空栈阶段,栈顶(extended stack pointer,简称是esp)在栈底的低一个位置,呵呵,其实很好理解,就是说最初的箱子是空

最大熵学习笔记(一)预备知识

  生活中我们经常听到人们说"不要把鸡蛋放到一个篮子里",这样可以降低风险.深究一下,这是为什么呢?其实,这里边包含了所谓的最大熵原理(The Maximum Entropy Principle).本文为一则读书笔记,将对最大熵原理以及由此导出的最大熵模型进行介绍,重点给出其中所涉及数学公式的理解和详细推导. 相关链接 最大熵学习笔记(零)目录和引言 最大熵学习笔记(一)预备知识 最大熵学习笔记(二)最大熵原理 最大熵学习笔记(三)最大熵模型 最大熵学习笔记(四)模型求解 最大熵学习笔

汇编入门学习笔记 (一)—— 基础知识、寄存器

疯狂的暑假学习之  汇编入门学习笔记 (一) 参考:<汇编语言> 王爽  第一,二章 一.基础知识 1. 用汇编语言编写程序的工作过程 汇编本质就是为了方便程序员,把二进制代码用汇编指令来表示 汇编指令---------------->  编译器  ---------------->机器码----------------> 计算机执行 mov ax, bx                                                          100

《solidity学习笔记》chapter 2-solidity基础知识

映射 映射本质上是存储和查找数据所用的键-值对. mapping (uint => string) intToStr; 地址 以太坊区块链由 account (账户)组成,你可以把它想象成银行账户.一个帐户的余额是 以太 (在以太坊区块链上使用的币种),你可以和其他帐户之间支付和接受以太币,就像你的银行帐户可以电汇资金到其他银行帐户一样.每个帐户都有一个"地址",你可以把它想象成银行账号.这是账户唯一的标识符. mapping (address => uint )publi

《solidity学习笔记》chapter 3-solidity其他知识

Ownable contracts OpenZeppelin Solidity库里的合约之一,可以通过继承使用. /**  * @title Ownable  * @dev The Ownable contract has an owner address, and provides basic authorization control  * functions, this simplifies the implementation of "user permissions".  *

数据结构学习笔记04树(堆 哈夫曼树 并查集)

一.堆(heap) 优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序. 数组 : 插入 — 元素总是插入尾部 ~ O ( 1 ) 删除 — 查找最大(或最小)关键字 ~ O ( n ) 从数组中删去需要移动元素 ~ O( n ) 链表: 插入 — 元素总是插入链表的头部 ~ O ( 1 ) 删除 — 查找最大(或最小)关键字 ~ O ( n ) 删去结点 ~ O( 1 ) 有序数组: 插入 — 找到合适的位置

《C++ Primer Plus》学习笔记 第1章 预备知识

第一章 预备知识C++在C语言的基础上添加了对"面向对象编程"的支持和对"泛型编程"的支持.类 —— 面向对象模板 —— 泛型编程1.1 C++简介1.2 C++简史1.3 可移植性和标准1.4 程序创建的技巧http://www.cnblogs.com/moonlightpoet/p/5611668.html1.5 总结

3D Game Programming withDX11 学习笔记(一) 数学知识总结

在图形学中,数学是不可或缺的一部分,所以本书最开始的部分就是数学知识的复习.在图形学中,最常用的是矢量和矩阵,所以我根据前面三个章节的数学知识,总结一下数学知识. 一.矢量 数学中的矢量,拥有方向和长度.其实矢量和点在坐标系中的表示完全一致(笛卡尔坐标系为准),区分矢量和点的关键,我觉得就是做平移.点是不能用平移操作来保证一致的,比如点A(1,2,3)经过平移矢量(1,2,3)后就是B(2,4,6),此时就是一个新的点.但是矢量经过相同平移操作后,还是矢量(1,2,3),这是因为矢量表示的是 v

Html+css学习笔记------比较不错的前端知识网站

1,http://www.divcss5.com/css-hack/#top   div+css学习 2,http://www.w3school.com.cn/html5/index.asp  w3cshool学习 3,http://www.w3cplus.com/  前端不错技术网站 4,https://github.com/  程序员天堂 5,http://www.zhangxinxu.com/wordpress/  个人博客 各类UED 腾讯 腾讯CDC http://cdc.tencen