首页 > 编程知识 正文

js栈和堆的区别,Java中栈内存和堆内存的区别

时间:2023-05-06 12:22:50 阅读:25392 作者:4067

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循环内部的变量

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。