JAVA在执行程序时,在存储器中分割5个区域进行数据的存储。 分别为1 :寄存器。 2 )本地方法区域。 3 )方法区。 4 :堆栈。 5 )堆栈。
基本上,堆栈堆栈和堆栈heap这个概念很重要,我不太清楚,以后不用学了。
以下是最近几天堆栈和堆栈的学习记录和心得。 必须记录下来。 以后如果你有新的东西要学,慢慢补充。
一、先说一下最基本的要点
基本数据类型、局部变量保存在堆栈存储器中,使用结束后消失。
new创建的实例化对象和数组存储在堆内存中,并在用完后通过垃圾回收机制不定期地自动删除。
二、先明确以上两点,以下示例就比较好理解了
示例1
主() )
int x=1;
show () )
int x=2
主函数main ()中变量int x=1,show ) )函数中定义变量int x=1。 最后show ) )函数执行完毕。
执行上述步骤。
步骤——main ()函数是程序入口,JVM首先被执行,打开了在堆栈存储器中存储int型变量x的空间,其值为1。
步骤——JVM为show ) )函数,在堆栈存储器中存储int型变量x,用值2打开新的区域。
此时,主空间和show空间共存,同时工作,互不影响。
步骤——show ()执行完成后,变量x立即释放,空间消失。 但main (函数空间依然存在,main中的变量x依然存在,不受影响。
示意图如下:
——————————————————————————————————————————————————————————————————————
示例2
主() )
int[] x=new int[3];
x[0]=20
在主函数main ()中定义数组x、要素类型int、要素个数3。
以上程序执行步骤
步骤1——int[]x=newint[3];
隐藏下一个分支
JVM执行main ()函数,在堆栈存储器中创建存储x变量(x变量为局部变量)的空间。
堆内存还开设了用于存储new int[3]数组的空间,堆内存将自动存储0x0045等起始地址值。
数组中的地址值附加在x上。 这样,x也有地址值。 所以,x指向这个数组(参照)。 此时,所有元素都没有值,但有默认的初始化值0。
步骤——执行x[0]=20
也就是说,堆内存中名为[0]的数组元素被分配20。 因此,数组中三个元素的值分别为20、0和0
图如下。
——————————————————————————————————————————————————————————————————————
示例3
主() )
int[] x=new int[3];
x[0]=20
x=null;
以上步骤执行步骤
1、2步骤——与例2完全相同,省略。
步骤3—— x=执行空值;
null表示删除空值,即x的引用数组内存地址0x0045后,不再指向堆栈内存中的数组。 此时,堆中的数组不再用于x,即视为垃圾,JVM启动垃圾回收机制并不定期自动删除。
图如下所示
——————————————————————————————————————————————————————————————————
示例4
主() )
int[] x=new int[3];
int[] y=x;
y[1]=100
x=null;
以上步骤执行步骤
步骤——与实施例2的步骤1一致,省略。
执行步骤2——int[]y=x,
在堆栈存储器中定义新的数组变量存储器y,同时将x的值0x0045添加到y中。 因此,y也指向堆内存中的同一数组。
执行步骤3——y[1]=100
也就是说,堆内存中名为[0]的数组元素被分配20。 因此,数组中三个元素的值分别为0、100和0
执行步骤4——x=null
变量x不再指向堆栈内存中的数组。 但是,变量y仍然指向,所以数组不会消失。
图如下所示
——————————————————————————————————————————————————————————————————
示例5
Car c=new Car;
c.color='blue ';
Car c1=new Car;
c1.num=
5;虽然是个对象都引用new Car,但是是两个不同的对象。每一次new,都产生不同的实体
——————————————————————————————————————————————————————————————————
示例6
Car c=new Car;
c.num=5;
Car c1=c;
c1.color="green";
c.run();
Car c1=c,这句话相当于将对象复制一份出来,两个对象的内存地址值一样。所以指向同一个实体,对c1的属性修改,相当于c的属性也改了。
三、栈和堆的特点
栈:
函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配。
栈内存特点,数数据一执行完毕,变量会立即释放,节约内存空间。
栈内存中的数据,没有默认初始化值,需要手动设置。
堆:
堆内存用来存放new创建的对象和数组。
堆内存中所有的实体都有内存地址值。
堆内存中的实体是用来封装数据的,这些数据都有默认初始化值。
堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除,这也是JAVA优于C++的表现之一(C++中需要程序员手动清除)。
注:
什么是局部变量:定义在函数中的变量、定义在函数中的参数上的变量、定义在for循环内部的变量