关于掌握C#的内存堆栈概念
很多时候,我们使用C#语言书写业务逻辑时,并不会太多地主动考虑到内存的占用和分配问题,但编的程序多了,就总会遇到一些性能问题。提到"性能"二字,就不得不考虑CPU和内存,而提到内存占用和使用效率,就不得不提到“堆栈”。于是我就想把堆栈这个概念彻底弄明白,于是打算写一篇文章记录下自己理解的过程。由于也是进行学习分享,所以我不想长篇累牍地去将其它人的文章内容抄取回来,只想把“读懂”的过程写出来,以便将来继续接续现在的理解进行深入研究。
首先,还是先说一下概念吧。
线程堆栈:简称栈 Stack,是一种后进先出的数据结构,当使用时,都是从栈顶取起;之所以叫它线程堆栈,是因为在程序运行时,每个线程(Thread)都会维护一个自己的专属线程堆栈,它存储的类型包括了值类型、指针、CPU指令等,关于详细的过程,可以链接到这个文章"浅谈C#中堆和栈的区别(附上图解)"。
托管堆: 简称堆 Heap,堆是一种经过排序的树形数据结构,每个结点都有一个值,在程序运行时,我们声明的引用类型对象new操作所申请的内存空间,就是堆上的节点,使用时,通过栈上的指针从中提取数据。
这二者的区别是,Stack是不受控制的,而且比起托管堆来说,空间是很有限的,他是编译时申请好的一片内存使用区域(参照上面线程堆栈的定义及链接文章中的说明),不需要我们用程序管理也不会被GC所回收;堆则不同,他需要GC来进行清理,如果不清理则会一直存在,直到再次调用这个节点时发生内存泄露错误(那么这时引入第二篇文章,方便读者您继续将这二者的区别弄明白“数据结构的堆和栈”)。
那么,概念就是这样了,然后需要弄明白的主要问题就是,如何通过在程序设计中考虑堆栈和托管堆的高效合理使用,来提升我们写的程序的执行效率。
关于掌握C#的内存堆栈概念的更多相关文章
- STM32/GD32上内存堆栈溢出探测研究
无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找!主要溢出情况如下:1,一般RAM最后两块空间是堆Heap和栈Stack,堆从下往上用,栈从上往下用,任意一个用完,都会进入对方的空间2, ...
- linux中高端内存和低端内存的概念【转】
转自:http://blog.csdn.net/hdujinhuihui/article/details/8686817 高端内存是Linux中一个重要的概念,初涉Linux时曾经对这个概念非常迷惑. ...
- Linux与堆栈概念
在学习C/C++编程的时候,老师都会反复灌输一些概念.比如程序内变量在堆栈上的分配,栈是由高地址到低地址,堆是由低地址到高地址等等,然后画出这样一幅经典概念图: 图片来自:http://blog.cs ...
- jvm 堆栈概念
关于JVM的工作原理以及调优是一个向往已久的模块,终于有幸接触到:http://pengjiaheng.iteye.com/blog/518623 那就顺着这个思路,来梳理一下自己看到后的结论和感想. ...
- JVM内存模型、指令重排、内存屏障概念解析
在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...
- JVM内存模型、指令重排、内存屏障概念解析(转载)
在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...
- 作为php了解一下共享内存的概念及优缺点
共享内存是一种在相同机器中两个正在运行的进程之间共享和传递数据的有效方式,不同进程之间共享的内存通常安排为同一段物理内存:顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.一个进程可创建一 ...
- LyScript 实现对内存堆栈扫描
LyScript插件中提供了三种基本的堆栈操作方法,其中push_stack用于入栈,pop_stack用于出栈,而最有用的是peek_stack函数,该函数可用于检查指定堆栈位置处的内存参数,利用这 ...
- arcgis engine 中出现的内存堆栈溢出问题。
两种解决方案: 1.循环加载mxd文档的时候出现的堆栈溢出,解决办法是每次循环结束时清空FeatureLayer,感觉并不好,但是确实可以实现功能. 2.循环调取featureclass的search ...
随机推荐
- C#API函数
API函数是构筑Windows应用程序的基石,是Windows编程的必备利器.每一种Windows应用程序开发工具都提供了间接或直接调用了Windows API函数的方法,或者是调用Windows A ...
- pandas 运算
Data frame 和 series 的运算:横列相加减:按照index ,row 的方向直接相加减.frame-series纵列相加减:按照 columns,运用算术函数,相加减. frame.s ...
- Dapper 条件语句(Where) 中参数使用
public static List<ECInput> GetECInputList(DateTime beginDate,DateTime endDate,string[] barcod ...
- Weex了解
weex描述 weex是一个使用web开发体验来开发高性能原生应用的框架,能支持vue.js框架.它可以实现用同一套代码来构建Andriod.IOS和web应用.可以实现使用JavaScript和流行 ...
- HttpConnection的使用
项目中需要与第三方系统交互,而交互的方式是XML报文形式,所以会用到HttpConnection与第三方系统连接交互,使用起来并不复杂,但是有几点需要注意的: 1.乱码的问题解决 2.超时的设置,注意 ...
- Jdev 本地RUN页面时候,将异常直接显示出来,而不是乱码
本地运行页面时,经常会遇到以下错误 oracle.jbo.JboException: JBO-29000: JBO-29000: JBO-26028: ???? MemberAttributesDis ...
- H3C WA2610i-GN FitAP telnet打开
在ac上面:sys_hidecmd 隐藏模式wlan ap ap1 exec-control enable ##目前为disable状态wlan ap ap1 telnet enable ##目前为e ...
- 弄懂flex布局
目前在不考虑IE以及低端安卓机(4.3-)的兼容下,已经可以放心使用flex进行布局了.什么是flex布局以及它的好处,这里就不再赘述. 在这篇文章里,想说说flex布局的属性语法及其细节.那么网上也 ...
- tooltip提示框组件
Tooltip 提示框组件 可独立于其他组件通过$.fn.tooltip.defaults重写默认的defaults.当用户移动鼠标指针在某个元素上时,出现提示信息窗口来显示额外信息.提示内容可以包含 ...
- 201621123005《Java程序设计》第四周学习总结
201621123005<Java程序设计>第四周学习总结 标签(空格分隔): 1.本章学习总结 1. 面向对象设计 1.1 写出你认为本周学习中比较重要的知识点关键词 继承.多态.覆盖. ...