Java中堆和栈(java栈和堆)

Java中堆和栈(java栈和堆)转:https://www.cnblogs.com/ibelieve618/p/6380328.htmlJAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了。以下是这几天栈和堆的学习记录和心得。得些记录下来。以后有学到新的,会慢慢补充。…

大家好,又见面了,我是你们的朋友全栈君。

转:https://www.cnblogs.com/ibelieve618/p/6380328.html

JAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。

基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了。

以下是这几天栈和堆的学习记录和心得。得些记录下来。以后有学到新的,会慢慢补充。

 

一、先说一下最基本的要点

基本数据类型、局部变量都是存放在栈内存中的,用完就消失。
new创建的实例化对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。

 

 

二、先明确以上两点,以下示例就比较好理解了

示例1

main()
  int x=1;
show ()
  int x=2

主函数main()中定义变量int x=1,show()函数中定义变量int x=1。最后show()函数执行完毕。

以上程序执行步骤:

第1步——main()函数是程序入口,JVM先执行,在栈内存中开辟一个空间,存放int类型变量x,同时附值1。
第2步——JVM执行show()函数,在栈内存中又开辟一个新的空间,存放int类型变量x,同时附值2。
     此时main空间与show空间并存,同时运行,互不影响。
第3步——show()执行完毕,变量x立即释放,空间消失。但是main()函数空间仍存在,main中的变量x仍然存在,不受影响。

示意图如下:

Java中堆和栈(java栈和堆)

 

——————————————————————————————————————————————————————————————————————

示例2

main()
  int[] x=new int[3];
  x[0]=20

主函数main()中定义数组x,元素类型int,元素个数3。

以上程序执行步骤
第1步——执行int[] x=new int[3];
  隐藏以下几分支
  JVM执行main()函数,在栈内存中开辟一个空间,存放x变量(x变量是局部变量)。
  同时,在堆内存中也开辟一个空间,存放new int[3]数组,堆内存会自动内存首地址值,如0x0045。
  数组在栈内存中的地址值,会附给x,这样x也有地址值。所以,x就指向(引用)了这个数组。此时,所有元素均未附值,但都有默认初始化值0。

第2步——执行x[0]=20
  即在堆内存中将20附给[0]这个数组元素。这样,数组的三个元素值分别为20,0,0

示图如下:

Java中堆和栈(java栈和堆)

——————————————————————————————————————————————————————————————————————

示例3
main()
  int[] x=new int[3];
  x[0]=20
  x=null;

以上步骤执行步骤
第1、2步——与示例2完全一样,略。

第3步——执行x=null;
  null表示空值,即x的引用数组内存地址0x0045被删除了,则不再指向栈内存中的数组。此时,堆中的数组不再被x使用了,即被视为垃圾,JVM会启动垃圾回收机制,不定时自动删除。

示图如下

Java中堆和栈(java栈和堆)

——————————————————————————————————————————————————————————————————

示例4
main()
  int[] x=new int[3];
  int[] y=x;
  y[1]=100
  x=null;

以上步骤执行步骤

第1步——与示例2第1步一致,略。
第2步——执行int[] y=x,
  在栈内存定义了新的数组变量内存y,同时将x的值0x0045附给了y。所以,y也指向了堆内存中的同一个数组。
第3步——执行y[1]=100
  即在堆内存中将20附给[0]这个数组元素。这样,数组的三个元素值分别为0,100,0
第4步——执行x=null
  则变量x不再指向栈内存中的数组了。但是,变量y仍然指向,所以数组不消失。

示图如下

Java中堆和栈(java栈和堆)

——————————————————————————————————————————————————————————————————

示例5

Car c=new Car;
c.color=”blue”;
Car c1=new Car;
c1.num=5;

 虽然是个对象都引用new Car,但是是两个不同的对象。每一次new,都产生不同的实体

Java中堆和栈(java栈和堆)

 

——————————————————————————————————————————————————————————————————

示例6

Car c=new Car;
c.num=5;
Car c1=c;
c1.color=”green”;
c.run();

Car c1=c,这句话相当于将对象复制一份出来,两个对象的内存地址值一样。所以指向同一个实体,对c1的属性修改,相当于c的属性也改了。

Java中堆和栈(java栈和堆)

 

 

三、栈和堆的特点

栈:

函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配。
栈内存特点,数数据一执行完毕,变量会立即释放,节约内存空间。
栈内存中的数据,没有默认初始化值,需要手动设置。

 

堆:

堆内存用来存放new创建的对象和数组。
堆内存中所有的实体都有内存地址值。
堆内存中的实体是用来封装数据的,这些数据都有默认初始化值。
堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除,这也是JAVA优于C++的表现之一(C++中需要程序员手动清除)。

 

注:

什么是局部变量:定义在函数中的变量、定义在函数中的参数上的变量、定义在for循环内部的变量

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125402.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ZDH大数据采集平台-采集mysql数据到hdfs

    ZDH大数据采集平台-采集mysql数据到hdfs目录项目源码创建mysql数据源创建本地hdfs数据源配置采集任务配置调度点击执行记录查看具体日志高级使用项目源码数据采集平台管理端https://github.com/zhaoyachao/zdh_web数据采集平台服务https://github.com/zhaoyachao/zdh_serverweb端在线查看http://zycblog.cn:8081/login用户名:zyc密码:123456界面只是为了参考功能,底层的数据.

    2022年6月10日
    89
  • mac如何装windows系统_bootcamp您的磁盘未能分区

    mac如何装windows系统_bootcamp您的磁盘未能分区问题:启动磁盘不能被分区或恢复成单个分区苹果电脑装了双系统,但是一直用的mac系统,所以打算把windows卸载。看到网上说直接用Bootcamp助理卸载就行,但是点“继续”的时候出现问题:启动磁盘不能被分区或恢复成单个分区。接下来就是要解决这个问题啦!可以看到我现在有三个盘,MachintoshHD为mac系统所在盘,这是我要保留的,另外两个是装windows分配的盘,所以需要卸载这…

    2022年8月11日
    6
  • java:单例模式的五种实现方式[通俗易懂]

    java:单例模式的五种实现方式[通俗易懂]基于java实现到单例模式

    2022年7月7日
    27
  • LightOJ 1027 A Dangerous Maze 概率期望

    LightOJ 1027 A Dangerous Maze 概率期望

    2022年3月7日
    35
  • mysql 前缀索引 语法_MySQL 前缀索引

    mysql 前缀索引 语法_MySQL 前缀索引索引前缀使用字符串列的索引规范中的语法,您可以创建仅使用列首字符的索引。以这种方式仅索引列值的前缀可以使索引文件小得多。为a或column编制索引时,必须为索引指定前缀长度。例如:col_name(N)NBLOBTEXTCREATETABLEtest(blob_colBLOB,INDEX(blob_col(10)));前缀最长可以为1000个字节(InnoDB表中为767…

    2022年5月24日
    34
  • linux安装配置Mysql详细步骤

    linux安装配置Mysql详细步骤下载Mysqlrpm包官网下载:https://dev.mysql.com/downloads/mysql/如果你到了这里,本地应该有了如下四个rpm包:mysql-community-client-5.7.26-1.el6.x86_64.rpmmysql-community-common-5.7.26-1.el6.x86_64.rpmmysql-community-libs-5…

    2022年4月29日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号