网站建设与制作 试卷与答案,网站建设与开发是什么岗位,保山做网站建设,万网租空间 网站在说堆和栈之前#xff0c;我们先说一下JVM#xff08;虚拟机#xff09;内存的划分#xff1a;
Java程序在运行时都要开辟空间#xff0c;任何软件在运行时都要在内存中开辟空间#xff0c;Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域#x…在说堆和栈之前我们先说一下JVM虚拟机内存的划分
Java程序在运行时都要开辟空间任何软件在运行时都要在内存中开辟空间Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域启动时在自己的内存区域中进行更细致的划分因为虚拟机中每一片内存处理的方式都不同所以要单独进行管理。
JVM内存的划分有五片
1. 寄存器
2. 本地方法区
3. 方法区
4. 栈内存
5. 堆内存。
我们重点来说一下堆和栈
栈内存:栈内存首先是一片内存区域存储的都是局部变量凡是定义在方法中的都是局部变量方法外的是全局变量for循环内部定义的也是局部变量是先加载函数才能进行局部变量的定义所以方法先进栈然后再定义变量变量有自己的作用域一旦离开作用域变量就会被释放。栈内存的更新速度很快因为局部变量的生命周期都很短。
堆内存:存储的是数组和对象其实数组就是对象凡是new建立的都是在堆中堆中存放的都是实体对象实体用于封装数据而且是封装多个实体的多个属性如果一个数据消失这个实体也没有消失还可以用所以堆是不会随时释放的但是栈不一样栈里存放的都是单个变量变量被释放了那就没有了。堆里的实体虽然不会被释放但是会被当成垃圾Java有垃圾回收机制不定时的收取。
下面我们通过一个图例详细讲一下堆和栈
比如主函数里的语句 int [] arrnew int [3];在内存中是怎么被定义的
主函数先进栈在栈中定义一个变量arr,接下来为arr赋值但是右边不是一个具体值是一个实体。实体创建在堆里在堆里首先通过new关键字开辟一个空间内存在存储数据的时候都是通过地址来体现的地址是一块连续的二进制然后给这个实体分配一个内存地址。数组都是有一个索引数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化这是堆内存的特点未初始化的数据是不能用的但在堆里是可以用的因为初始化过了但是在栈里没有不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体那么堆和栈是怎么联系起来的呢?
我们刚刚说过给堆分配了一个地址把堆的地址赋给arrarr就通过地址指向了数组。所以arr想操纵数组时就通过地址而不是直接把实体都赋给它。这种我们不再叫他基本数据类型而叫引用数据类型。称为arr引用了堆内存当中的实体。可以理解为c或c的指针Java成长自c和c很像优化了c如果当int [] arrnull;
arr不做任何指向null的作用就是取消引用数据类型的指向。
当一个实体没有引用数据类型指向的时候它在堆内存中不会被释放而被当做一个垃圾在不定时的时间内自动回收因为Java有一个自动回收机制而c没有需要程序员手动回收如果不回收就越堆越多直到撑满内存溢出所以Java在内存管理上优于c。自动回收机制程序自动监测堆里是否有垃圾如果有就会自动的做垃圾回收的动作但是什么时候收不一定。
所以堆与栈的区别很明显
1.栈内存存储的是局部变量而堆内存存储的是实体
2.栈内存的更新速度要快于堆内存因为局部变量的生命周期很短
3.栈内存存放的变量生命周期一旦结束就会被释放而堆内存存放的实体会被垃圾回收机制不定时的回收。