转载文章: https://www.cn blogs.com/I believe 618/p/6380328.html
如果有侵权,请联系我,马上删除!
JAVA在执行程序时,在存储器中分割5个区域进行数据的存储。 分别为1 :寄存器。 2 )本地方法区域。 3 )方法区。 4 :堆栈。 5 )堆栈。 (有关——JVM运行时内存分配https://www.cn blogs.com/ys ocean/p/6759737.html的信息,请参见此处。)
一、要点基本数据类型、局部变量存储在堆栈存储器中,使用完毕后消失。
new创建的实例化对象和数组存储在堆内存中,并在用完后通过垃圾回收机制不定期地自动删除。
二、例示例1
main () {int x=1; show (; }show () intx=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
main () (int ) ) x=newint ) ); 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
main () (int ) ) x=newint ) ); x[0]=20x=null; }按以上步骤执行步骤
1、2步骤——与例2完全相同,省略。
步骤3—— x=执行空值;
null表示删除空值,即x的引用数组内存地址0x0045后,不再指向堆栈内存中的数组。 此时,堆中的数组不再用于x,即视为垃圾,JVM启动垃圾回收机制并不定期自动删除。
图如下所示
示例4
main () (int ) ) x=newint ) ); int[] y=x; y [1]=100 x=空值; }按以上步骤执行步骤
步骤——与实施例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循环内部定义的变量