Java程序在运行的时候都要先开辟一个内存空间。JVM(全称Java Virtual Machine),也就是Java虚拟机。
JVM运行时在内存中开辟的内存区域,启动时在这片区域内自己还会进行更细致的划分,因为虚拟机中每片内存处理的方式都不一样,所以要分别单独进行管理。
JVM内存的划分主要是下列五个:
- 寄存器
- 本地方法去
- 方法区
- 栈内存
- 堆内存
栈内存
栈内存里面存储的都是局部变量。
什么是局部变量?凡是定义在方法中的都是局部变量,for循环内定义的也是局部变量。
先加载函数才能进行局部变量的定义,所以在方法进栈后,然后再定义变量,变量是有自己的作用域,一旦离开这个作用域,变量就会马上被释放。也因此,栈内存的更新速度非常快,这也是因为局部变量的生命周期都很短。
堆内存
堆内存里面存储的是数组和对象。(数组也算是对象的一种。)
什么是对象?凡是new
建立的都是在堆中,堆中存放的都是实体(也就是对象)。
实体用于封装数据,而是封装了多个,如果一个数据消失,这个实体却没消失,则还可以使用。所以堆是不会随时释放的,但是栈就不一样了,栈里面存放的都是单个变量,变量被释放了,就消失了。堆里的实体虽然不会被释放,但会被Java垃圾回收机制当做垃圾不定时的收取。
主函数首先进入了栈中,在栈中定义了一个arr
的变量,但右边不是一个具体值,是一个实体。
实体是被创建在堆内存里面的,在堆里面首先通过new
开辟了空间。内存在存储数据的时候,都是通过地址值来体现的,地址值是一块连续的二进制,然后给这个实体分配了一个内存地址。
数组都是有一个索引,数组这个实体在堆内存中产生后每一个空间都会进行默认的初始化,不同的类型初始化的值不一样。
所以在栈和堆当中分别创建了变量和实体。
当一个实体没有引用数据类型指向的时候,是不会被释放掉,而是会被当做垃圾。
Java有一个自动回收机制,会自动检测堆里是否存有垃圾,如果有,那么就会回收垃圾,但是至于什么时候回收就不一定了。
堆内存和栈内存的区别
- 栈内存存储的是局部变量;堆内存存储的是实体。
- 栈内存的更新速度要快于堆内存,是因为局部变量的生命周期短。
- 栈内存存放的变量一旦结束就会释放;堆内存存放的实体会被垃圾回收机制不定时回收。