更多免费教学文章请关注这里
在说堆和栈之前,我们先说一下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.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
java中 static变量和方法到底是存在内存什么区域呢?

JVM内存总体一共分为了

4个部分(stack segment、heap segment、code segment、data segment)
当我们在程序中,申明一个局部变量的时候,此变量就存放在了 stack segment(栈)当中;
当new 一个对象的时候,此对象放在了heap segment(堆)当中;
而static 的变量或者字符串常量 则存在在 data segment(数据区)中;
那么类中方法的话,是存在在 code segment(代码区)中了。

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

  1. Java面试--堆和栈的概念和区别

    堆和栈的概念和区别[转载自博客] 在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的 ...

  2. 堆和栈的概念和区别 python_堆和栈的概念和区别

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

  3. Java中堆和栈的概念与区别

    栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再 ...

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

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

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

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

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

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

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

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

  8. 堆和栈的联系与区别(转贴)

    总结的不错. Part 1: 首先,我们举一个例子: void f() { int* p=new int[5]; } 这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内 ...

  9. 堆、栈、队列的区别和联系

    数据结构中的堆.栈和队列 堆:堆是一种经过排序的树形数据结构,每个结点都有一个值.通常我们所说的堆的数据结构,是指二叉堆.堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆.由于堆的这个 ...

最新文章

  1. iOS 直播专题5-推流
  2. opencv 霍夫线变换
  3. Angular2.0 基础: Form
  4. 各地结婚年龄出炉,哪个地方的人最晚婚?
  5. Kuskal/Prim POJ 1789 Truck History
  6. Backbone - create model
  7. ioc spring 上机案例_通过实例解析Spring Ioc项目实现过程
  8. Linux环境变量详解
  9. 秦叶阳(1986-),女,就职于北京大学,安徽荣创智能科技有限公司联合创始人...
  10. 【linux C】C语言中常用的几个函数的总结【二】
  11. python手动抛出异常
  12. 计算机学科分类与代码,(数学、计算机学科分类与代码.doc
  13. Linux切换jdk版本
  14. python名字起源_你知道这些编程语言名字的由来吗
  15. 移动应用跨平台框架江湖将现终结者?速来参拜来自Facebook的React Native
  16. 移动支付“车水码龙”,但也小心“塞翁失码”
  17. 专家称“988”心理健康热线是一次“变革”,但目前运营上面临困境
  18. 考研—计算机网络—应用层
  19. 紫铜带、黄铜带、锡磷青铜带、白铜带的特性
  20. 湖北师范大学----操作系统实训(c语言)

热门文章

  1. 动手学习数据分析(三)——数据重构
  2. 大数据分析的方法有哪些
  3. 大数据在消防安全中的新应用
  4. 关于java集合的知识点_java中集合的知识点
  5. c语言如何在坐标输出,tc 如何在指定坐标处 输出bmp图片??
  6. python执行js脚本安全吗_手把手教你如何使用Python执行js代码
  7. python char 相等_用 Python 实现 Excel文本函数
  8. AcWing 840. 模拟散列表(散列hash)
  9. EZEMC测试软件_四种常见的EMC仿真软件介绍
  10. 持久化存储技术之本地存储