黑马程序员技术交流社区

标题: .NET的堆和栈 ,基本概念 [打印本页]

作者: sunrise2    时间: 2014-7-15 12:35
标题: .NET的堆和栈 ,基本概念
本帖最后由 sunrise2 于 2014-7-15 12:43 编辑

                                           .NET的堆和栈 ,基本概念
          当我们对.NETFramework的一些基本面了解之后,实际上,还是很有必要了解一些更底层的知识。比如.NETFramework是如何进行内存管理的,是如何垃圾回收的.. ....这样,我们才能写出更高性能的程序。
          在.NETFramework中,有2个地方帮我们保存管理数据:一个是"堆",也叫"托管堆",由.NETFramework的垃圾收集器(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
什么是"堆"
   可以把""想像成一些摆放无序的盒子,引用类型实例存储于此。
        
我们可以在任何时候,使用任何盒子。我们需要借助垃圾收集器(GarbageCollection, GC)的自动回收机制或手动处理,以保证"堆"的盒子被及时回收。

       另外,根据引用类型实例的大小,"堆"分为"GC堆"和"LOH(Large Object Heap)堆",当引用类型实例大小小于85000个字节的时候,实例被分配在"GC堆"上;当实例大小大于或等于于85000个字节的时候,实例被分配在"LOH(Large Object Heap)堆"。
在.NET Framework中,所有派生于System.Object的就是引用类型,引用类型实例位于"堆"。引用类型包括:
      ● 类 class
      ● 接口 interface
      ● 委托 delegate
      ● object
      ● string



作者: 向晓伟    时间: 2014-7-15 12:48
学习了!
作者: sunrise2    时间: 2014-7-15 12:50
向晓伟 发表于 2014-7-15 12:48
学习了!

简单,很重要的基础,加油
作者: --_—    时间: 2014-7-16 09:41
好贴,顶一个
作者: sunrise2    时间: 2014-7-16 12:11
--_— 发表于 2014-7-16 09:41
好贴,顶一个

谢谢,相互学习
作者: 童心    时间: 2014-7-16 14:33
这些知识对编程还是有帮助的
作者: 麦田怪圈    时间: 2014-7-18 17:03
路过学习了!
作者: 傅磊    时间: 2014-8-5 21:40
顶一个!
作者: rende1991    时间: 2014-8-5 22:26
赞赞赞
作者: mouxingyu    时间: 2014-8-6 06:16
路过学习了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2