1.和堆一样存储在计算机RAM中
2.栈是为执行线程留出的内存空间
3.栈附属于线程,因此当线程结束时栈被回收
4.线程被创建的时候,设置栈的大小
5.当用栈过多时会导致栈溢出(无穷次/大量的递归调用,或者大量的内存分配)
6.如果在编译之前精确的知道要分配数据的大小并且不是太大的时候,可以使用栈

栈底层

1.栈经常与sp寄存器一起工作,最初sp指向栈顶
2.CPU用push指令将数据压栈,用pop指令来弹栈。压栈时sp值减少,弹栈时sp值增大,存取和获取数据都是CPU寄存器的值
3.当函数被调用时,CPU使用特定的指令把当前的IP(存放偏移地址的一个寄存器)压栈,即执行代码的地址,CPU接下来将调用函数地址赋给IP,进行调用,当函数返回时,旧的IP被弹栈,CPU继续执行函数调用之前的代码。
4.当进入函数时,sp向下扩展,扩展到确保为函数的局部变量留存足够大小的空间。当函数返回时,sp通过返回原来的位置来释放空间。
5.如果函数有参数的话,在函数调用之前,会将参数压栈,函数中的代码通过sp的当前位置来定位参数并访问他们。
6.栈要受到内存块的限制,不断的函数嵌套/为局部变量分配太多的空间,可能会导致栈溢出。当栈中的内存区域都已经被使用完之后继续向下写(低地址),会触发一个CPU异常。

1.和栈一样存储在计算机RAM中
2.堆是为动态分配预留的内存空间
3.堆通常通过运行时在应用程序启动时被分配,当应用程序(进程)退出时被回收
4.在应用程序启动的时候,设置堆的大小,但是可以在需要的时候进行扩展
5.如果申请的缓冲区过大的话,可能申请失败
6.在运行期间不知道会需要多大的数据或者需要分配大量的内存的时候,建议使用堆

堆底层

1.堆包含一个链表来维护已用和空闲的内存块。在堆上新分配内存是从空闲的内存块中找到一些满足要求的合适块,这个操作会更新堆中的块链表。
2.堆增加新块通常从低地址向高地址扩展。因此可以认为堆随着内存分配而不断的增加大小。
3.申请和释放许多小的块可能会产生如下状态:在已用块之间存在很多小的空闲块,进而申请大块内存失败,虽然空闲块的总和足够,但是空闲的小块是零散的,不能满足申请的大小,也就是堆碎片。
4.当旁边有空闲块的已用块被释放时,新的空闲块可能会与相邻的空闲块合并为一个大的空闲块,这样可以有效的减少堆碎片的产生。

每一个线程都有一个栈,但是每一个应用程序通常都只有一个堆(为不同类型分配内存使用多个堆的情况也是有的)。 栈比堆要快,因为它的存取模式使它可以轻松的分配和重新分配内存(指针/整型只是进行简单的递增或者递减运算),所有的空闲内存都是连续的。

点击查看参考的栈和堆底层的相关原文

点击查看栈和堆存储数据的区别,可以借鉴一下这篇文章

对于栈内存和堆内存的理解相关推荐

  1. 栈内存与堆内存,堆内存的使用与理解。

    15)栈内存,是小块的内存,由操作系统自动管理. 堆内存,是大块内存,由程序"手动"申请&释放.(需要写代码去"申请malloc","释放fr ...

  2. 数据类型,栈内存、堆内存

    一.基础数据类型 二.栈和堆的区别 三.栈内存.堆内存 四.栈.队列.树.链表 基础数据类型 我把它总结为:USONB(是不是很nice哈哈) Undefined.String.Symbol.Obje ...

  3. java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  4. 秒懂 栈内存和堆内存(深入底层)

    一般理解 很多人对内存的认识并没有那么透彻. 只知道基本数据类型(值类型)存放在"栈内存"中.引用数据类型(对象类型)存放在"堆内存"中. 内存概念 首先,栈和 ...

  5. JS 中的 栈内存和堆内存

    栈内存 1.访问顺序 栈是一种先进后出的数据结构,栈内存是内存中用于存放临时变量的一片内存块. 它是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶,另一端称为栈底. 2.存储数据 一 ...

  6. 栈内存和堆内存的区别与原理

    目录 B站讲解视频地址 栈内存和堆内存的区别与原理 栈数据结构 堆数据结构 变量类型与内存的关系 基本数据类型 引用数据类型 从内存角度来看变量复制 基本数据类型的复制 引用数据类型的复制 栈内存和堆 ...

  7. java 堆内存和栈内存的区别_java中栈内存和堆内存有什么区别

    栈内存和堆内存的区别: 1.栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中. (视频教程推荐:java视频 ...

  8. JavaScript变量——栈内存or堆内存

    原文  http://blog.csdn.net/xdd19910505/article/details/41900693 堆和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就 ...

  9. python释放变量内存_Python尚学堂高淇|1113引用的本质栈内存,堆内存,内存的示意图,标识符,变量的声明初始化,垃圾回收机制...

    011-引用的本质-栈内存和堆内存-内存的示意图在Python当中,变量也成为:对象的引用,因为,变量的存储就是对象的地址变量通过地址引用了对象变量位于堆内存(压栈,出栈等细节,后续再介绍)对象位于: ...

  10. Java栈内存、堆内存、方法区对对象和引用的关系

    问题:Java栈内存.堆内存.方法区对对象和引用的关系 答案: 1.单个对象 如图所示: (1)首先类加载器加载要运行的类,首先将main方法加载进方法区,并进栈内存,顺序执行代码,创建对象,将对象的 ...

最新文章

  1. maven初学者常见错误汇总(三)
  2. 大一java实训报告1500字_从800字小作文,到3000字小论文你用了多久? | 校媒FM
  3. Linux下大文件处理
  4. java 包权限_Java基础(十二)之包和权限访问
  5. ABAP Modification browser SE95
  6. 【转】ubuntu16.04安装配置tftp服务
  7. 深入掌握JMS(五):实战Topic
  8. 张一鸣早期创业的访谈还挺有启发,不知道他现在的观念有没有改变
  9. iptables实战系列:通过NAT转发实现私网对外发布信息
  10. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_04-freemarker基础-基础语法种类...
  11. SpringMVC Redirect 跳转后保存Model中的数据
  12. 报表如何集成 echarts 官网示例图
  13. 美联储印钞,中国物价为何上涨?
  14. oeasy教您玩转vim - 48 - # ed由来
  15. NDT算法配准代码学习,很详细,很多不懂,一句一句解释。
  16. 浙江师范大学数学与计算机科学学院仇秋生,仇秋生 中文主页 浙江师范大学教师个人主页系统...
  17. 神经网络和深度神经网络,图神经网络和神经网络
  18. 7.MATLAB参数统计与假设检验-常用非参数检验
  19. 戴尔笔记本电脑重装Win10 Pro 后,开机慢的解决方法,DELL Vostro 3420
  20. MQTT——EMQX学习笔记01——EMQX安装使用

热门文章

  1. Mybatis的truncate table方法与SQL语句delete的区别
  2. 提高 Kubernetes 中的 GPU 利用率
  3. 基于python的动物判别系统
  4. 【组织架构】中国铁路南宁局集团有限公司
  5. 利用Turbo C进行平面二维图形的平移,旋转,缩放,对称
  6. c++三国杀【免费复制】——转载
  7. 分布式存储FastDFS(自用)
  8. Cesium设置实体初始偏移量
  9. 北航计算机学院吉祥物,北航软件学院吉祥物征集令
  10. Word中如何把同一级编号一次性上升或下降一级或任意级,做到随意调整编号层级?