内存的划分:
1,寄存器。
2,本地方法区。
3,方法区。
4,栈内存。
存储的都是局部变量。
而且变量所属的作用域一旦结束,该变量就自动释放。
5,堆内存。
存储是数组和对象(其实数组就是对象) ,凡是new建立的都在堆中。
特点:
1)每一个实体都有首地址值。
2)堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。整数是0,小数0.0或者0.0f,boolean类型是false,char类型是 ‘\u0000‘,引用数据类型是NULL
3)垃圾回收机制。
全局变量和局部变量的区别:
局部变量是定义在方法内的变量,在其作用域结束时被释放;
全局变量是定义在方法外的变量。
程序代码运行时内存工作流程演示:
演示代码:
1 class Demo2 2 { 3 public static void main(String[] args) 4 { 5 int[] arr = new int[3]; 6 arr[2] = 5; 7 System.out.print(arr[2]); 8 9 } 10 }
演示图解:
文字说明:
1)在栈内存中为main函数开辟一个内存空间;
2)在main的内存空间为局部变量arr开辟一个内存空间;
3)在堆内存中开辟一个内存空间存放实体数组,数组自动初始化;
4)将堆内存中开辟的数组首地址传给栈内存中的局部变量arr;
5)arr[2]的值修改;
6)控制台上打印arr[2]的值。
tips:
1)数组的确定必须明确其长度;
2)堆内存中的实体会自动初始化,而栈内存中不会,并且栈中未初始化会在编译时报错;
3)堆内存中开辟给数组的空间首地址传给栈内存的数组名变量,数组名变量保存值为 [[email protected]哈希值 ;( [ 表示引用指向数组,I 表示引用指向数组为int型,@之后是哈希值,通过哈希值计算得出引用在堆内存中的首地址)
数组代码常见异常:
1)ArrayIndexOutOfBoundsException:(此异常在编译时通过,在运行时报错)
当访问到数组中不存在的角标时,就会发生该异常。
2)NullPointerException:(此异常在编译时通过,在运行时报错)
当引用型变量没有任何实体指向时,还在用其操作实体,就会发生该异常。