温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中JVM、堆内存和栈内存的概念和区别是什么

发布时间:2022-02-23 15:56:03 来源:亿速云 阅读:174 作者:iii 栏目:开发技术

这篇文章主要介绍“Java中JVM、堆内存和栈内存的概念和区别是什么”,在日常操作中,相信很多人在Java中JVM、堆内存和栈内存的概念和区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中JVM、堆内存和栈内存的概念和区别是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

JVM

JVM(全称Java Virtual Machine),也就是Java虚拟机。

Java程序在运行的时候都要开辟一个空间,也就是说任何软件在运行的时候都需要开辟空间,同样JVM也不例外,也需要开辟空间。JVM运行时在内存中开辟的内存区域,启动时在这片区域内自己还会进行更细致的划分,因为虚拟机中每片内存处理的方式都不一样,所以要分别单独进行管理。

JVM内存的划分主要是下列五个:

  1. 寄存器

  2. 本地方法去

  3. 方法区

  4. 栈内存

  5. 堆内存

栈内存

栈内存里面存储的都是局部变量。

什么是局部变量?凡是定义在方法中的都是局部变量,for循环内定义的也是局部变量。

先加载函数才能进行局部变量的定义,所以在方法进栈后,然后再定义变量,变量是有自己的作用域,一旦离开这个作用域,变量就会马上被释放。也因此,栈内存的更新速度非常快,这也是因为局部变量的生命周期都很短。

堆内存

堆内存里面存储的是数组和对象。(数组也算是对象的一种。)

什么是对象?凡是new建立的都是在堆中,堆中存放的都是实体(也就是对象)。

实体用于封装数据,而是封装了多个,如果一个数据消失,这个实体却没消失,则还可以使用。所以堆是不会随时释放的,但是栈就不一样了,栈里面存放的都是单个变量,变量被释放了,就消失了。堆里的实体虽然不会被释放,但会被Java垃圾回收机制当做垃圾不定时的收取。

例子:

int[] arr = new int[3];在内存中是怎样被定义的?

如图所示,主函数首先进入了栈中,在栈中定义了一个arr的变量,但右边不是一个具体值,是一个实体。

实体是被创建在堆内存里面的,在堆里面首先通过new开辟了空间。内存在存储数据的时候,都是通过地址值来体现的,地址值是一块连续的二进制,然后给这个实体分配了一个内存地址。

数组都是有一个索引,数组这个实体在堆内存中产生后每一个空间都会进行默认的初始化,不同的类型初始化的值不一样。

所以在栈和堆当中分别创建了变量和实体。

    

那么栈内存和堆内存要怎么联系起来?

前文提到,每个实体进入堆内存后,都被分配一个内存地址。把这个内存地址赋给变量arrarr就可以通过地址找到数组。所以arr想要操纵数组,就得通过地址,而不是直接把实体都赋给它。所以,这种我们不再称呼为基本数据类型,而是引用数据类型,称为arr引用了堆内存当中的实体。

如果当 int[] arr = null;

arr不做任何指向,null的作用就是取消引用数据类型的指向。

当一个实体没有引用数据类型指向的时候,是不会被释放掉,而是会被当做垃圾。

Java有一个自动回收机制,会自动检测堆里是否存有垃圾,如果有,那么就会回收垃圾,但是至于什么时候回收就不一定了。

堆内存和栈内存的区别

通过以上内容,可以得出以下几点不同:

  • 栈内存存储的是局部变量;堆内存存储的是实体。

  • 栈内存的更新速度要快于堆内存,是因为局部变量的生命周期短。

  • 栈内存存放的变量一旦结束就会释放;堆内存存放的实体会被垃圾回收机制不定时回收。

到此,关于“Java中JVM、堆内存和栈内存的概念和区别是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI