栈内存vs堆内存

Java程序在运行的时候都要先开辟一个内存空间。JVM(全称Java Virtual Machine),也就是Java虚拟机。

JVM运行时在内存中开辟的内存区域,启动时在这片区域内自己还会进行更细致的划分,因为虚拟机中每片内存处理的方式都不一样,所以要分别单独进行管理。

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

  1. 寄存器
  2. 本地方法去
  3. 方法区
  4. 栈内存
  5. 堆内存

栈内存

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

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

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


堆内存

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

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

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


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

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

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

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


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

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


堆内存和栈内存的区别

  • 栈内存存储的是局部变量;堆内存存储的是实体。
  • 栈内存的更新速度要快于堆内存,是因为局部变量的生命周期短。
  • 栈内存存放的变量一旦结束就会释放;堆内存存放的实体会被垃圾回收机制不定时回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值