在讨论堆和堆栈之前,让我们先谈谈虚拟机(JVM )的内存划分。
Java程序在运行时必须打开空间,任何软件在运行时都必须在内存中打开空间,在Java虚拟机运行时也必须打开空间。 JVM运行时在内存中创建内存区域,启动时在自己的内存区域中进行更细的分隔。 虚拟机中每个内存的处理方法不同,因此需要单独管理。
JVM内存被分割成5张。
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的作用是取消引用数据类型的指向。
如果实例未按引用数据类型指示,则不会释放到堆内存中,而是将其视为垃圾,并在不定期的时间自动回收。 (c中没有,因为Java有自动回收机制。 Java在内存管理方面优于c,因为程序员需要手动回收,如果不回收,则会堆积到内存已满。 自动回收机制(程序)自动监测堆中是否存在垃圾,有则自动进行垃圾回收的动作,但何时回收并不一定。
堆栈和堆栈的区别很明显:
1 .堆栈存储器存储局部变量,堆存储器存储实体
2 .堆栈内存更新速度快于堆内存。 因为局部变量的生命周期短;
3 .存储在堆栈内存中的变量生命周期结束时释放,存储在堆栈内存中的实体由垃圾回收机制不定期回收。