很多时候,我们使用C#语言书写业务逻辑时,并不会太多地主动考虑到内存的占用和分配问题,但编的程序多了,就总会遇到一些性能问题。提到"性能"二字,就不得不考虑CPU和内存,而提到内存占用和使用效率,就不得不提到“堆栈”。于是我就想把堆栈这个概念彻底弄明白,于是打算写一篇文章记录下自己理解的过程。由于也是进行学习分享,所以我不想长篇累牍地去将其它人的文章内容抄取回来,只想把“读懂”的过程写出来,以便将来继续接续现在的理解进行深入研究。

  首先,还是先说一下概念吧。

线程堆栈:简称栈 Stack,是一种后进先出的数据结构,当使用时,都是从栈顶取起;之所以叫它线程堆栈,是因为在程序运行时,每个线程(Thread)都会维护一个自己的专属线程堆栈,它存储的类型包括了值类型、指针、CPU指令等,关于详细的过程,可以链接到这个文章"浅谈C#中堆和栈的区别(附上图解)"。
   托管堆: 简称堆 Heap,堆是一种经过排序的树形数据结构,每个结点都有一个值,在程序运行时,我们声明的引用类型对象new操作所申请的内存空间,就是堆上的节点,使用时,通过栈上的指针从中提取数据。

   这二者的区别是,Stack是不受控制的,而且比起托管堆来说,空间是很有限的,他是编译时申请好的一片内存使用区域(参照上面线程堆栈的定义及链接文章中的说明),不需要我们用程序管理也不会被GC所回收;堆则不同,他需要GC来进行清理,如果不清理则会一直存在,直到再次调用这个节点时发生内存泄露错误(那么这时引入第二篇文章,方便读者您继续将这二者的区别弄明白数据结构的堆和栈)。

  那么,概念就是这样了,然后需要弄明白的主要问题就是,如何通过在程序设计中考虑堆栈和托管堆的高效合理使用,来提升我们写的程序的执行效率。

  

  

关于掌握C#的内存堆栈概念的更多相关文章

  1. STM32/GD32上内存堆栈溢出探测研究

    无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找!主要溢出情况如下:1,一般RAM最后两块空间是堆Heap和栈Stack,堆从下往上用,栈从上往下用,任意一个用完,都会进入对方的空间2, ...

  2. linux中高端内存和低端内存的概念【转】

    转自:http://blog.csdn.net/hdujinhuihui/article/details/8686817 高端内存是Linux中一个重要的概念,初涉Linux时曾经对这个概念非常迷惑. ...

  3. Linux与堆栈概念

    在学习C/C++编程的时候,老师都会反复灌输一些概念.比如程序内变量在堆栈上的分配,栈是由高地址到低地址,堆是由低地址到高地址等等,然后画出这样一幅经典概念图: 图片来自:http://blog.cs ...

  4. jvm 堆栈概念

    关于JVM的工作原理以及调优是一个向往已久的模块,终于有幸接触到:http://pengjiaheng.iteye.com/blog/518623 那就顺着这个思路,来梳理一下自己看到后的结论和感想. ...

  5. JVM内存模型、指令重排、内存屏障概念解析

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  6. JVM内存模型、指令重排、内存屏障概念解析(转载)

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  7. 作为php了解一下共享内存的概念及优缺点

    共享内存是一种在相同机器中两个正在运行的进程之间共享和传递数据的有效方式,不同进程之间共享的内存通常安排为同一段物理内存:顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.一个进程可创建一 ...

  8. LyScript 实现对内存堆栈扫描

    LyScript插件中提供了三种基本的堆栈操作方法,其中push_stack用于入栈,pop_stack用于出栈,而最有用的是peek_stack函数,该函数可用于检查指定堆栈位置处的内存参数,利用这 ...

  9. arcgis engine 中出现的内存堆栈溢出问题。

    两种解决方案: 1.循环加载mxd文档的时候出现的堆栈溢出,解决办法是每次循环结束时清空FeatureLayer,感觉并不好,但是确实可以实现功能. 2.循环调取featureclass的search ...

随机推荐

  1. webservice获取天气信息

    效果 1.eclipse中新建一个Java项目 2.通过命名获取天气的客户端信息 首先,打开天气网站http://ws.webxml.com.cn/WebServices/WeatherWS.asmx ...

  2. SQL SERVER连接池

    Connection Pool 是什么呢 ?每当程序需要读写数据库的时候.Connection.Open()会使用ConnectionString连接到数据库,数据库会为程序建立 一个连接,并且保持打 ...

  3. String类的subString(i)方法(基于jdk 1.9)

    只有一个参数的: String str = new String("ABCD"); System.out.println("str="+str.substrin ...

  4. JS检查数组中是否存在某个值

    //三个参数,在array中查找needle,bool为布尔量,如果为true则返回needle在array中的位置function inArray2(needle,array,bool){      ...

  5. numpy.random之常用函数

    在实际开发中,我们经常会使用随机函数,比如交叉验证,构造测试数据等.下面,是我常用的几个生成随机样本的函数: 1,rand(n1,n2,…,nn) 每一维度都是[0.0,1.0)半闭半开区间上的随机分 ...

  6. python的经典类与新式类

    新式类:class Myclass(object): pass 经典类:class Myclass: pass 新式类里面加了一些新方法,例如重写父类: class A(object): def __ ...

  7. pycharm debug

    1  debug 的模式,只有在打断点是才能运行. 2  主方法运行的时候 ,可以在下面输入一行 a =1 .方便debug 打完断电的会出现三角头, 运行甲壳虫 3   一步一步运行, F8 , 当 ...

  8. h5和app原生联调触发方法

    //路径跳转 urlHref(item) {//人物.访谈.动态是一个页面 var para = {}; para.title = "动态详情"; para.type = &quo ...

  9. 严重:Error configuring application listener of class org.springframework.web.util.IntrospectorCleanupListener

    mave项目换了一个新的工作空间时出现的问题 原因: 其实是你的jar文件没有同步发布到自己项目的lib目录中(如果你是用Maven进行构建的话) 可以试试 下面的办法 解决方案: 项目点击右键 点击 ...

  10. (MSSQL)sp_refreshview刷新视图失败及更新Table字段失败的问题解决

    在近期工作中遇到一个任务,需要批量更改散布在很多Table中的某字段,同时刷新相关视图,但是在执行脚本时,发现了如下问题 更新字段问题 消息 ,级别 ,状态 ,第 行 对象'View_Simple' ...