首先我们要了解在JVM内存是分为:寄存器、本地方法区、方法区、栈内存、堆内存。
我们着重说下堆和栈的异同:
栈:
栈内存是一片内存区域,存储的都是局部变量,凡是定义在方法中的全是局部变量,for循环的内部定义也是局部变量,首先要加载函数才能进行局部变量的定义,而且局部变量也有作用域,只在本方法有效,一旦离开了本作用域,变量就会被释放。因为局部变量的生命周期很短,所以说栈内存的更新速度很快。
堆:
堆内存主要储存的是对象,但凡通过new关键字建立的都存在在堆中,堆中存放的都是实体,实体用于封装数据,而且实体类中通常包含多个属性,这样的话,即便一个数据消失,本实体依旧存在,所以堆并不会对其中的对象进行释放。对于堆中对象的处理只能通过JVM的垃圾回收机制,对对象进行不定时的回收。
在堆栈中的数据存储:
主函数先进栈,在栈中定义一个变量,再在堆中通过new开辟一个空间,然后空间会生成一段连续的二进制地址值,然后堆中的地址值会赋给栈中的变量,使得栈中的变量值通过地址能指向堆中的实体对象。堆内存会给每一个空间进行默认的初始化。