1、Java程序一运行,都必须在内存中开辟空间,因为CPU处理内存中数据速度较快。JVM启动也需要进行空间的开辟
2、每一个Java程序在运行时,一共开辟五片区域来分配内存(每一片内存空间中数据的处理方式不同,要单独进行划分和管理)。内存划分:寄存器(CPU在处理)、本地方法区(native修饰的方法,方法内容看不到,会转成调用底层C的代码,调用系统内容。与所在系统相关,JVM分好多版本(windows、linux、ios等),在不同版本下调用不同操作系统中的内容)、方法区、栈内存、堆内存
3、内存在存储数据时都通过地址来体现,所以任何数据在内存中都有地址
4、栈:栈中存储的都是局部变量。栈内存的更新速度很快,因为变量的生命周期都比较短
局部变量:定义在方法中的变量
所以先有函数(进栈),再有局部变量。所属变量的作用域一旦结束,该变量就自动释放
5、堆:堆中存储的是实体(数组、对象)。凡是new建立的都在堆中,堆不会随时释放
实体用于封装多个数据
所以堆中存实体,实体存数据
堆内存中的变量都会有默认初始化
(1)整数byte、short、int、long --> 0
(2)小数float、double --> 0.0
(3)boolean --> false
(4)char --> '\u0000' 相当于空格
6、堆内存的特点:
(1)每一个实体都有一个首地址值(在内存中开辟空间),实体被使用往往通过地址指向
(2)堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同(JVM自动完成),否则堆中变量无法使用
(3)垃圾回收机制(与C++相比,内存管理的不同)
7、栈内存中的变量/方法会被释放/弹栈,而堆内存中的实体会变成垃圾等待被回收
多个引用变量可以同时指向一个实体,实体没有任何引用变量指向时才变成垃圾