在说堆和栈之前,我们先说一下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.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

mysql中堆和栈_堆和栈的区别相关推荐

  1. mysql smallint 长度_转:mysql中int、bigint、smallint 和 tinyint的区别与长度的含义

    bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. P.S. b ...

  2. mysql left outer join_关于mysql中的left join和left outer join的区别

    关于mysql中的left join和left outer join的区别 LEFT JOIN是LEFT OUTER JOIN的简写版; 内连接(INNER JOIN) :只连接匹配的行; 左外连接( ...

  3. 【mysql】mysql 中 text,longtext,mediumtext 字段类型的意思, 以及区别

    mysql 中 text,longtext,mediumtext 字段类型的意思, 以及区别 mysql 中 text,longtext,mediumtext 字段类型区别为:字节限制不同.I/O 不 ...

  4. Mysql中删除语句delete、truncate、drop的区别

    Mysql中删除语句delete.truncate.drop的区别 1.DROP: 用法: DROP TABLE 表名 DDL语句,删除数据和表结构,释放空间资源.注意:操作不放到rollback s ...

  5. 在MySQL中,MUL、PRI和UNI有什么区别?

    从Mysql 5.7文件: 如果键是PRI,则列是主键或多列主键中的列之一. 如果键是UNI,则该列是唯一索引的第一列.(唯一索引允许多个空值,但可以通过检查Null字段来判断该列是否允许空.) 如果 ...

  6. MySQL中any、some、all、in的区别

    MySQL中any.some.all.in的区别 子查询是指在一个select语句中嵌套另一个slect语句. any.in.some.all分别是子查询关键词之一. 其中,any可以与=.>. ...

  7. mysql中堆和栈_堆和栈 - 矮油~ - 博客园

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...

  8. mysql中的leading用法_登录 - SegmentFault 思否

    前面我们主要分享了MySQL中的常见知识与使用.这里我们主要分享一下MySQL中的高阶使用,主要包括:函数.存储过程和存储引擎. 对于MySQL中的基础知识,可以参见 1 函数 函数可以返回任意类型的 ...

  9. mysql中jxgl什么意思_使用Management Studio按下表信息在JXGL数据库中创建名为CJ的成绩表。...

    [单选题]Java源文件和编译后的文件扩展名分别为() [简答题]1.请大家做完实验后将数据填写到表格相应空格中,教师验收,当堂签字确认. 2.课下按照指导书上关于实验报告的书写部分完成数据处理.总结 ...

最新文章

  1. Kong APIGW — Overview
  2. ar9344 9382 8035 编程器固件_沈阳熔铜炉设计,紧固件加热炉_宏祥电炉
  3. 高等数学下-赵立军-北京大学出版社-题解-练习12.2
  4. 《代码整洁之道 Clean Architecture》-读书笔记
  5. [解决方案]ln:无法创建符号链接‘ /usr/bin/python‘:权限不够
  6. hdu4504java
  7. 【语音信号处理四】DTW算法
  8. FLASH动画之制作动画
  9. 考计算机初级难不难,初级程序员好考吗_考试难不难_上学吧
  10. 北京博物馆十大镇馆之宝
  11. 高通MSM8998芯片数据资料参考
  12. 计蒜客 428(人人都有极客精神-日期问题)
  13. SQLServer查询某天数据语法
  14. 荣耀70什么时候发布 荣耀70发布时间曝光
  15. 服务器不能用pe安装win7系统安装,PE安装win7系统失败的完美解决方案
  16. 【杂谈】给瑞典的曾先生:出门在外,低调行事
  17. 6G及太赫兹关键技术
  18. 金属膜电阻 碳膜电阻 水泥电阻 铝壳电阻比较
  19. Linux-运维自动化之系统安装
  20. 高性能 Nginx HTTPS 调优 - 如何为 HTTPS 提速 30%

热门文章

  1. 用eclipse在windows下搭建cocos2d-x开发环境
  2. SQL中distinct的用法(四种示例分析)
  3. C++11 类型推导decltype
  4. 0909 初识操作系统
  5. Nginx+UWSGI+Django配置全过程
  6. 关于seo优化的核心思想
  7. Windows Server 2003 服务应用大全之DNS服务使用详解
  8. php 创建文件编码,php fopen创建utf8编码文件例子
  9. 高级政工师具备的能力_一个合格的政工师应该具备哪些条件与素质
  10. python输出print(x+y)_Python语句序列“x='car';y=2; print(x+y)”的输出结果是_学小易找答案...