在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分:

Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域,启动时在自己的内存区域中进行更细致的划分,因为虚拟机中每一片内存处理的方式都不同,所以要单独进行管理。

JVM内存的划分有五片:

1. 寄存器;

2. 本地方法区;

3. 方法区;

4. 栈内存;

5. 堆内存。

我们重点来说一下堆和栈:

栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

堆内存:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

下面我们通过一个图例详细讲一下堆和栈:

比如主函数里的语句 int [] arr=new int [3];在内存中是怎么被定义的:

主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,但是右边不是一个具体值,是一个实体。实体创建在堆里,在堆里首先通过new关键字开辟一个空间,内存在存储数据的时候都是通过地址来体现的,地址是一块连续的二进制,然后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是堆内存的特点,未初始化的数据是不能用的,但在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体:

那么堆和栈是怎么联系起来的呢?

我们刚刚说过给堆分配了一个地址,把堆的地址赋给arr,arr就通过地址指向了数组。所以arr想操纵数组时,就通过地址,而不是直接把实体都赋给它。这种我们不再叫他基本数据类型,而叫引用数据类型。称为arr引用了堆内存当中的实体。(可以理解为c或c++的指针,Java成长自c++和c++很像,优化了c++)

如果当int [] arr=null;

arr不做任何指向,null的作用就是取消引用数据类型的指向。

当一个实体,没有引用数据类型指向的时候,它在堆内存中不会被释放,而被当做一个垃圾,在不定时的时间内自动回收,因为Java有一个自动回收机制,(而c++没有,需要程序员手动回收,如果不回收就越堆越多,直到撑满内存溢出,所以Java在内存管理上优于c++)。自动回收机制(程序)自动监测堆里是否有垃圾,如果有,就会自动的做垃圾回收的动作,但是什么时候收不一定。

所以堆与栈的区别很明显:

1.栈内存存储的是局部变量而堆内存存储的是实体;

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

堆和栈的概念和区别 python_堆和栈的概念和区别相关推荐

  1. 堆和栈的概念和区别 python_堆和栈的概念和区别(转载)

    在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的.JVM运行时在内存中开辟一片内存 ...

  2. 堆和栈的概念和区别 python_堆和栈的区别是啥?

    展开全部 1.堆栈空间分配 栈(2113操作系5261统):由操作系统自动分配释放 ,存放函数4102的参数值,局1653部变量的值等.其操作方式类似于数据结构中的栈. 堆(操作系统): 一般由程序员 ...

  3. 堆和栈的概念和区别 python_堆的意思

    字: 堆 简解: 堆 duī 累积在一起的东西:堆栈.堆房.土堆. 累积在一起,聚积在一起:堆积.堆放.堆垒.堆摞.堆砌. 量词,用于成堆的物或成群的人:一堆人. 笔画数:11: 部首:土: 笔顺编号 ...

  4. 堆和栈的概念和区别 python_C++堆用法详解

    堆(heaps)是一种特殊的数据组织方式,STL 中的 priority_queue 容器适配器底层就是采用堆来组织数据存储的.为了弄明白堆是什么,首先要搞清楚什么是树存储结构. 树是分层排列的元素或 ...

  5. C/C++ 全局变量和局部变量在内存里的区别?堆和栈

    一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分  1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈 ...

  6. 堆(概念,数据结构中堆与内存堆区的区别 ,堆的基本操作)

    堆的特性: 必须是完全二叉树 用数组实现 任一结点的值是其子树所有结点的最大值或最小值 最大值时,称为"最大堆",也称大根堆: 在完全二叉树中,任何一个子树的最大值都在这个子树的根 ...

  7. .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一(转)

    http://www.codingthink.com/c/20121223/201212231458171.html 原文出处: http://www.c-sharpcorner.com/Upload ...

  8. python静态变量和动态变量_动态变量和静态变量的区别,堆和栈的区别

    动态变量和静态变量的区别: 1.存储位置 动态变量:存储在内存出栈数据区 静态变量:存储在全局数据区(静态数据区) 2.生命期 动态变量:根据你定义的位置确定,比如你在一个函数中定义的,那么超出该函数 ...

  9. 什么是内存中的堆和栈?与数据结构中的堆和栈有什么区别?

    内存中的堆和栈 一直使用堆和栈的相关概念,对内存中(操作系统)中的堆与栈和数据结构中的堆与栈一直不求甚解,这次,突然想起这个问题,在此进行一个简单梳理归纳,如有错误,恳请读者指出. 栈(stack) ...

最新文章

  1. php客服窗口,制作一个客服小界面
  2. 微软云创益大赛获奖团队风采:做一个中国特色的.Net源代码社区
  3. java list移除所有元素,从List中移除指定 List 中包含的其所有元素(可选操作)。...
  4. BZOJ 4823 Luogu P3756 [CQOI2017]老C的方块 (网络流、最小割)
  5. html5 居中 字体 字号,css字体水平居中
  6. 查询方法android的CursorLoader用法小结
  7. ubuntu系统中import h5py, ImportError: No module named h5py的解决方法
  8. JSP + Struts + Hibernate + Spring+MySQL+Myeclipse实现固定资产管理系统
  9. UI标签库专题九:JEECG智能开发平台 Choose(选则操作标签)
  10. 删除出现次数最少字符串JAVA_牛客网——华为机试(题23:删除字符串中出现次数最少的字符)(Java)...
  11. (step3.3) hdu 1059(Dividing——多重背包)
  12. int是python的内置函数吗_Python内置int函数详细介绍
  13. linux下的文件及目录介绍
  14. 《剑指offer》面试题16——反转链表(C++)
  15. tcp服务器修改ip,修改本地连接的TCP/IP属性设置
  16. 【BZOJ5316】【JSOI2018】绝地反击
  17. Delphi的日期时间格式
  18. python读取excel内容和写入_Python读取和写入Excel文件
  19. 【Kubernetes】Kubeadm安装的K8s集群的版本升级过程测试(二)
  20. linux设备驱动程序第二版 序言

热门文章

  1. 201521123014 《Java程序设计》第8周学习总结
  2. Linux压缩与解压常用命令
  3. 武汉大学2013年数学分析考研试题参考解答
  4. zoj2008 最短路
  5. C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
  6. [Bugku][Web][CTF] 9-15 write up
  7. 混合代码块 Markdown Leedcde
  8. HDU 6168 Numbers 思维
  9. BlueTooth 蓝牙音频音质探讨
  10. linux awr 日志,Linux平台生成awr报告