1. 寄存器;html
2. 本地方法区;c++
3. 方法区;程序员
4. 栈内存;面试
5. 堆内存。数组
代码:int [] arr=new int [3];
缓存
主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,可是右边不是一个具体值,是一个实体。实体建立在堆里,在堆里首先经过new关键字开辟一个空间,内存在存储数据的时候都是经过地址来体现的,地址是一块连续的二进制,而后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生以后每个空间都会进行默认的初始化(这是堆内存的特色,未初始化的数据是不能用的,但在堆里是能够用的,由于初始化过了,可是在栈里没有),不一样的类型初始化的值不同。因此堆和栈里就建立了变量和实体:
jvm
那么堆和栈是怎么联系起来的呢?函数
咱们刚刚说过给堆分配了一个地址,把堆的地址赋给arr,arr就经过地址指向了数组。因此arr想操纵数组时,就经过地址,而不是直接把实体都赋给它。这种咱们再也不叫他基本数据类型,而叫引用数据类型。称为arr引用了堆内存当中的实体。(能够理解为c或c++的指针,Java成长自c++和c++很像,优化了c++)
优化
若是当int [] arr=null;
,arr不作任何指向,null的做用就是取消引用数据类型的指向。.net
当一个实体,没有引用数据类型指向的时候,它在堆内存中不会被释放,而被当作一个垃圾,在不定时的时间内自动回收,由于Java有一个自动回收机制,(而c++没有,须要程序员手动回收,若是不回收就越堆越多,直到撑满内存溢出,因此Java在内存管理上优于c++)。自动回收机制(程序)自动监测堆里是否有垃圾,若是有,就会自动的作垃圾回收的动做,可是何时收不必定。
1.栈内存存储的是局部变量,基本类型的变量表示的是数据自己;而堆内存存储的是实体,每一个实体对象都有地址值和默认初始化值;
2.栈内存的读取和更新速度要快于堆内存,由于局部变量的生命周期很短;
3.栈内存使用一级缓存,存放的变量生命周期一旦结束就会被释放;而堆内存使用二级缓存,存放的实体会被垃圾回收机制不定时的回收。