堆(heap)与栈(stack)

堆和栈是程序运行的关键,很有必要它他们的关系说清楚。

在java中,Main函数就是栈的起始点,也是程序的起始点。程序要运行总是有一个起点的(程序执行的入口)。

概括:  

 1  栈是运行时的单位 , 而堆是存储的单元

栈解决程序的运行问题,即程序如何执行,或者说如何处理数据,

    堆解决的是数据存储的问题,即数据怎么放,放在哪儿

java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。

而堆则是所有线程共享的。

 疑问一:为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?

1. 从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。

这种隔离、模块化的思想在软件设计的方方面面都有体现。

2.堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。

好处:  a.提供了一种有效的数据交互方式(如:共享内存)

                b.堆中的共享常量和缓存可以被所有栈访问,节省了空间。

3. 栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。

由于栈只能向上增长,因此就会限制住栈存储内容的能力,

而堆不同,堆中的对象是可以根据需要动态增长的,

因此栈和堆的拆分使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。

4. 面向对象就是堆和栈的完美结合。

其实,面向对象方式的程序与以前结构化的程序在执行上没有任何区别。

但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思考。

当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;

       而对象的行为(方法),就是运行逻辑,放在栈中。

我们在编写对象的时候,其实就是编写了数据结构,也编写了处理数据的逻辑。不得不承认,面向对象的设计,确实很美。

 疑问二:  堆中存什么?栈中存什么?

1. 栈存储的信息都是跟当前线程(或程序)相关的信息(局部变量(局部变量表)、程序运行状态(操作数栈)、方法(动态连接)、方法返回值(方法返回地址))等,

栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是

在栈中,一个对象只对应了一个4byte的引用(堆栈分离的好处)。

     2. 堆只负责存储对象信息。

疑问三:  为什么不把基本类型放堆中呢?

1. 其占用的空间一般是1~8个字节---需要空间比较少

2.而且因为是基本类型,所以不会出现动态增长的情况---长度固定,因此栈中存储就够了,如果把它存在堆中是没有什么意义的(还会浪费空间,后面说明??)。

JVM:堆与栈的比较相关推荐

  1. java 线程栈空间_java线程的内存不包含在JVM堆与栈中

    Java代码   publicclassMaxThreadsTest { publicstaticvoidmain(String[] args) { while(true) { newThread(n ...

  2. JVM堆 栈 方法区详解

    一.栈 每当启用一个线程时,JVM就为他分配一个JAVA栈,栈是以帧为单位保存当前线程的运行状态 栈是由栈帧组成,每当线程调用一个java方法时,JVM就会在该线程对应的栈中压入一个帧 只有在调用一个 ...

  3. JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结

    俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面 ...

  4. JVM,堆,栈,方法区之间的关系

    什么是JVM? JVM就是Java虚拟机,它包含堆,栈以及方法区. 堆 1. 堆中存放的是 对象实例 // 堆中存放的就是 new Student() Student s = new Student( ...

  5. java:JVM内存结构初步理解入门:堆、栈、方法区(浅显通俗易懂自记)

    自己整理的一些资料以及自己的一些理解,希望记下来的不是高大上而晦涩的概念,将自己此时此刻的理解最大程度地刻模,以便将来重温知新. JVM内存结构最简单可以初步分为:1栈 2堆 3方法区 4 程序计数器 ...

  6. 8.JVM 关于对象分配在堆、栈、TLAB的理解

    引言 我们知道,一般在java程序中,new的对象是分配在堆空间中的,但是实际的情况是,大部分的new对象会进入堆空间中,而并非是全部的对象,还有另外两个地方可以存储new的对象,我们称之为栈上分配以 ...

  7. Jvm的堆、栈和数据结构的堆、栈的区别

    两者虽叫法相似,其实是指的是不同的东西: JVM中通常说的堆区和栈区其实是指内存中的 堆区 和 栈区.堆区主要用来存储实例化的对象信息,栈区存放方法调用链信息 Java 虚拟机(Java 使用的虚拟机 ...

  8. 细说JVM的数据类型、堆与栈

    Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值."引用值"代表了某个对象的引用,而不是 ...

  9. Jvm(29),理解升级----C语言中的堆和栈的区别 (可以借鉴)

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

最新文章

  1. CGpoint,CGSize,CGRect,NSRange
  2. 错误:ORA-12537: TNS: 连接关闭
  3. Visual Studio 2008 使用小技巧
  4. ReLu(Rectified Linear Units)激活函数
  5. Python可视化中的Matplotlib(5.直方图、条形图以及饼图的用法和详细的参数)
  6. sqlyog设置自动补全_Visual Studio Code 最好的功能、插件和设置
  7. Request 对象 错误 'ASP 0104 : 80004005' 解决方法
  8. java a 2_Java A* 算法(2)
  9. 关于EOF,转自新浪微博
  10. (44)VHDL实现多路复用器(if-else)
  11. 95-130-020-源码-source-SourceFunction
  12. 使用python实现可视化ftp客户端(本地文件展示和搜索功能、ftp文件展示和搜索功能以及上传和下载功能)
  13. 高中计算机会考知识点选择题,高中信息技术会考选择题知识点
  14. SU草图大师必备实用插件,拿走不谢!
  15. Rational Rose—概述
  16. kali linux 安装中文乱码,Kali Linux 2019-4解决安装中文乱码-Go语言中文社区
  17. 小程序云开发(一):新建云开发模板
  18. 【自动控制原理】 根轨迹法之根轨迹法分析系统性能
  19. 软件开发流程与项目管理
  20. Romberg(龙贝格)积分法 | matlab

热门文章

  1. MINA2-TCP服务端实例
  2. 用ProFTPD构建FTP服务器
  3. SQL里各种联合查询总结
  4. 【机器学习】梯度提升树(GBDT)的原理小结
  5. 最简单的基于FFmpeg的移动端例子:IOS 推流器
  6. SecureCRT上传和下载文件
  7. 深入浅出SNMP及其应用实例分析
  8. Qt网络编程——使用OpenCV与TCP搭建图像处理服务器
  9. 帝国整站PHP源码,帝国cms 诗词整站源码
  10. element手机验证格式_Excel数据验证:给数据把个关,工作效率有保障。