你知道java当中栈和堆的区别是什么吗?这两者之间究竟有什么不同之处呢?带着这个问题,让我们一起来通过下面的文章来了解一下吧!
注意,这个问题在java面试当中也是经常会出现的java面试题,大家一定不要错过这个道题目的解答哦。
在讲两者的区别之前,我们要先来讲一下java虚拟机(JVM)的内存的划分方面的内容。
JVM内存的划分有五片分别是寄存器、本地方法区、方法区、栈内存、堆内存。
下面再来重点的讲一下堆和栈。
先来讲栈内存。
栈内存首先是一片内存区域,存储的都是局部变量。
只要是定义在方法当中的,那么,就都是局部变量。
for循环内部定义的也是局部变量,先加载函数才可以进行局部变量的定义,所以方法先进栈,之后再定义变量。
变量有自己的作用域,只要是离开了作用域,那么,变量就会被释放。
栈内存的更新速度是非常快速的,这主要是因为,局部变量的生命周期都非常的短。
之后再来讲堆内存。
堆内存存储的是数组和对象。
只要是在new建立的就都是在堆当中,堆当中,存放的都是实体。
实体用来封装数据,并且,还是封装多个。
假如,一个数据消失了,这个实体也没有消失,还可以用,所以说,堆是不会随时释放的。
可是,栈就不一样了,栈里面存放的基本上都是单个变量,变量被释放了,那么就是没有了。
堆里的实体虽然说不会被释放,可是,会被当成垃圾,Java有垃圾回收机制不定时的收取。
讲完了这些之后,我们再通过下面的内容,再来详细的了解一下堆和栈吧。
例
主函数里的语句
nt [] arr=new int [3];在内存中是如何被定义的:
主函数先进栈,在栈当中定义一个变量arr,之后,为arr赋值,可是,右边不是一个具体值,是一个实体,实体创建在堆里,在堆里首先通过new关键字开辟一个空间,内存在存储数据的时候都是通过地址来体现的,地址是一块连续的二进制,之后给这个实体分配一个内存地址。
数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化,不同的类型初始化的值会不相同,所以堆和栈里就创建了变量和实体。
堆和栈又是如何才联系起来的呢?
刚刚已经讲过了,给堆分配了一个地址。
将堆的地址赋给arr,arr就通过地址指向了数组,所以说,在arr想操纵数组的时候,就通过地址。
这样的,我们叫他引用数据类型,而不是基本数据类型。
叫做arr引用了堆内存当中的实体。
假如
nt [] arr=null;
arr不做任何指向,null的作用就是取消引用数据类型的指向。
假如一个实体没有引用数据类型指向时,它在堆内存中不会被释放,而是会被当做一个垃圾,在不定时的时间内自动回收(Java有一个自动回收机制)。
总结:
堆与栈的区别主要有以下几点:
(1)栈内存存放的变量生命周期只要一结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收
(2)堆内存存储的是实体,但是,栈内存存储的是局部变量
(3)栈内存的更新速度比堆内存要快,原因就是,局部变量的生命周期非常的短
你还想了解更多的java基础知识吗?请继续关注本站的常见问题栏目来了解吧,更多java常见问答可以分享给你。
推荐阅读: