堆和栈的区别Java,堆和栈的区别先进先出
堆和栈的区别java
在说堆和栈之前,先说一下JVM(虚拟机)内存的分区:
JVM内存的划分有五片:
1.注册;
2.本地方法区域;
3.方法区域;
4.堆栈内存;
5.堆内存。
我们重点来说一下堆和栈:
堆栈内存:堆栈内存首先是一个内存区域,所有的局部变量都存储在这里。方法中定义的所有变量(方法外的全局变量)都是局部变量。for循环还定义了局部变量,只有先加载函数才能定义。因此,方法首先被堆叠,然后定义变量。变量有自己的作用域,一旦离开作用域,就会被释放。堆栈内存的更新速度很快,因为局部变量的生命周期很短。
堆内存:它存储数组和对象(实际上数组就是对象)。所有新的都构建在堆中,所有的实体(对象)都存储在堆中。实体是用来封装数据的,它们封装了实体的多个属性。如果一个数据消失了,实体仍然可以使用,所以堆不会随时被释放。然而,与堆栈不同,堆栈中存储的所有变量都是单个变量。堆中的实体虽然不会被释放,但是会被当作垃圾处理,Java有垃圾收集机制不定时收集。
下面我们通过一个图例详细讲一下堆和栈:
比如main函数中的语句int[]arr=new int[3];它在内存中是如何定义的:
main函数前进到堆栈,在堆栈中定义一个变量arr,然后给arr赋值,但是右边不是具体的值,而是一个实体。实体是在堆中创建的,new关键字首先在堆中打开一个空间。内存存储数据时,用地址来表示,地址是连续的二进制,然后给这个实体分配一个内存地址。数组总是有一个索引。实体数组在堆内存中生成后,每个空间都会默认初始化(这是堆内存的特点。未初始化的数据不能使用,但可以在堆中使用,因为它已经初始化,但不能在堆栈中使用)。不同类型的初始化有不同的值。所以变量和实体是在堆和栈中创建的:
如何解决写爬虫IP受阻的问题?立即使用。
那么堆和栈是怎么联系起来的呢?
我们刚才说给堆分配一个地址,把堆的地址分配给arr,arr通过地址指向数组。因此,当arr想要操作一个数组时,它会通过地址而不是直接将所有实体分配给它。我们不再称这个为基本数据类型,而是一个引用数据类型。arr是指堆内存中的一个实体。(可以理解为指向C或C的指针,Java是从C成长起来的,和C很像,是针对C优化的)
if int[]arr=null;
Arr不做任何指向,null的作用是取消引用数据类型的指向。
当一个实体没有被引用数据类型指向时,它不会在堆内存中被释放,而是被当作垃圾,不定期自动回收,因为Java有自动回收机制(而C没有,所以程序员需要手动回收。如果没有,就会越堆越多,直到内存溢出,所以Java在内存管理上优于C)。自动回收机制(程序)自动监控堆中是否有垃圾。如果有,会自动做垃圾回收,但不确定什么时候收。
所以堆与栈的区别很明显:
1.堆栈内存存储局部变量,而堆内存存储实体;
2.栈内存的更新速度比堆内存快,因为局部变量的生命周期短;
3.一旦存储在堆栈存储器中的变量的生命周期结束,它们将被释放,而存储在堆栈存储器中的实体将被垃圾收集机制不时地收集。
我们,大量免费的Java入门教程,欢迎在线学习!这就是堆和栈的区别。更多java的细节请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。