堆 先进先出    存取速度慢    存储数组和对象   动态分配内存    都是实体
栈 先进后出    存取速度快    存储变量

什么是堆内存?

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

堆内存的特点是什么?

第一点:堆其实可以类似的看做是管道,或者说是平时去排队买票的情况差不多
所以堆内存的特点就是:先进先出,后进后出,也就是你先排队好,你先买票。
第二点:堆可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的
但缺点是,由于要在运行时动态分配内存,存取速度较慢
new对象在堆中如何分配?
由Java虚拟机的自动垃圾回收器来管理

什么是栈内存

栈内存是Java的另一种内存,主要是用来执行程序用的
比如:基本类型的变量和对象的引用变量
栈内存首先是一片内存区域,存储的都是局部变量
凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量
是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域
一旦离开作用域,变量就会被释放
栈内存的更新速度很快,因为局部变量的生命周期都很短。

栈内存的特点

第一点:栈内存就好像一个矿泉水瓶,往里面放入东西,那先放入的沉入底部
所以它的特点是:先进后出,后进先出
第二点:存取速度比堆要快,仅次于寄存器,栈数据可以共享,但缺点是,存在栈中的数据大小与生存必须是确定的,缺乏灵活性

栈内存分配机制

栈内存可以称为一级缓存,由垃圾回收器自动回收
数据共享
例子:
int a = 3;
int b = 3;

JVM(虚拟机)内存的划分:

  Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域,启动时在自己的内存区域中进行更细致的划分,因为虚拟机中每一片内存处理的方式都不同,所以要单独进行管理。JVM内存的划分有五片:1.   寄存器;2.   本地方法区;3.   方法区;4.   栈内存;5.   堆内存。

下面我们例详细讲一下堆和栈:
主函数里的语句 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.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

什么是堆和栈以及区别详解相关推荐

  1. C语言中堆和栈的区别详解

    原文地址:https://blog.csdn.net/tigerjibo/article/details/7423728 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进制映像文件由栈, ...

  2. C/C++堆、栈及静态数据区详解

    五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.下面分别来介绍: 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面 ...

  3. 堆、栈及静态数据区详解

    堆.栈及静态数据区详解 五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储 ...

  4. 堆、栈及静态数据区详解 转

    内存分为代码区.全局数据区.堆区和栈区.堆一般存放动态数据,栈里一般存放局部成员. 关于堆栈和堆的概念 [问题] C++中创建本地(或者说局域)变量是在堆栈(stack)中分配内存地址,而创建全局变量 ...

  5. Java堆和栈的区别/联系详解

    Java堆和栈的区别/联系详解 关于Java中堆栈内存的知识,算是基础知识,和C语言中的指针有一些类似,面试中也经常会被问到,特别是跟Java和C都有关的开发工作. 一.堆栈的联系 在Java中,内存 ...

  6. 堆和栈的区别(面试经验总结)

    C++中,内存分为5个区:堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区.通常存放局部变量.函数参数等. 堆:是由new分配的内存块, ...

  7. 堆和栈的区别 (转贴)

    非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动 ...

  8. mysql中堆和栈_堆和栈的区别

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

  9. (009) java后台开发之堆和栈的区别

    转自:https://course.tianmaying.com/java-basic+object-usage# 堆和栈的区别 堆和栈都是Java中常用的存储结构,都是内存中存放数据的地方: 1.在 ...

最新文章

  1. CocoaPods安装及使用《转》
  2. java标志清理_JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)...
  3. 机房收费系统--准备工作
  4. 大数运算(5)——大数除法(取模、取余)
  5. 深度残差收缩网络:(五)实验验证
  6. 小米MIX 4屏幕规格曝光:华星光电1080P面板 或支持屏下摄像
  7. 用FileZilla搭建的Ftp其他电脑无法访问的问题
  8. 【只推荐一位】推荐一位资深Python爱好者,现任世界500强架构师
  9. [计算机组成原理-02] 计算机硬件的基本组成和工作原理
  10. JDBC深入浅出-jdbc学习笔记【入门到精通】
  11. Android手机写Java代码的软件
  12. 单链表的定义、特点、结构及其一些基本操作
  13. android peap,Android连接IEEE8021X PEAP  无感知WiFi
  14. 推荐几款HTML5开发工具
  15. 【正点原子Linux连载】第四十一章 嵌入式Linux LED驱动开发实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
  16. android adb 存储权限,android adb 权限修改
  17. zemax模拟ld_使用ZEMAX序列模式模拟激光二极管光源
  18. 关于一款开源远程控制软件(gh0st)的源码分析(一)
  19. 小笨狗的编程感悟:如何成为一个优秀的程序员
  20. 纯CSS实现粉红爱心动画

热门文章

  1. 未排序数组中累加和为给定值的最长子数组系列问题
  2. Spider_douyin
  3. 点云网络的论文理解(二)- PointNet的pytorch复现
  4. 产品经理经验谈50篇(三):在设定产品的功能优先级时,有哪些指导性原则与依据?
  5. MATLAB从入门到精通-控制系统动态特性的计算以及阶跃响应波德图等
  6. 4万字长文ClickHouse应用实战-物化视图在微信的实践
  7. Python入门100题 | 第020题
  8. github关联域名,创建个人网站教程终结篇
  9. spring data redis使用示例
  10. Caching Best Practices--reference