Java内存五大区
- 栈:用于保存函数内部的局部变量,函数形参,一旦超出作用域,就删除
- 堆:凡是new出来的东西都是存放在堆里,也可以说可变对象(非基本数据类型)都是保存在这里面。
- 堆里面的东西,都有一个内存(16进制),栈中存放的就是这个16进制的内存值。
- 堆里面存放的东西都用默认值:
- 整数:默认值0
- 浮点数:默认0.0
- 布尔:默认false
- 字符:默认’u0000‘
- 引用:默认null
- 本地方法栈:与操作系统有关
- 方法区:存储.class相关信息,包含方法的信息
- 寄存器:与CPU相关
堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。
为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没有什么意义的(还会浪费空间,后面说明)。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。
引用数据类型因为大小不固定,所以会存在堆内存
中,栈内存中存的是堆内存的地址,每次读取值时,先找到栈内存
中的内存地址,在通过内存地址,找到在堆内存
中的对应的对象。