Java中内存分配
- 栈内存
方法运行时,进入的内存,局部变量都存放于这块内存中
- 堆内存
new出来的内容都会进入堆内存,并且会存储地址值
- 方法区
字节码文件(即.class文件)加载时进入的内存
- 本地方法栈
调用操作系统相关资源
- 寄存器
交给CPU(中央处理器, Center Processing Unit)处理
数组内存图
- 一个数组内存图
- Test.java文件:
public class Test{
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
arr[0] = 11;
arr[1] = 22;
arr[2] = 33;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}';
- 上述代码所对应的内存图
- 加载进内存的详细步骤:
1.该类的字节码文件加载进方法区,main方法存放在字节码文件中;
2.main方法被JVM自动调用,进入栈内存执行;
3.arr数组变量在main方法中声明;
4.通过new关键字在堆内存中开辟空间,并产生地址值,因为new的是长度为3的数组,所以会划分出3块小格子(每个格子都会有自己的索引和默认初始化值,int类型默认为0,char类型为空字符,float和double默认为0.0,Boolean默认为false,引用数据类型默认为null);
5.将地址值赋值给main方法中的arr变量;
6.输出数组名存储的地址001,输出数组中存储的默认值;
7.修改数组arr中的默认值;
8.输出数组arr中的值;
9.main方法执行完毕,弹栈,程序运行结束。
- 两个数组内存图
- Test.java文件:
public class Test{
public static void main(String[] args) {
int[] arr1 = new int[2];
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
arr1[0] = 11;
arr1[1] = 22;
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println("------------------");
int[] arr2 = new int[3];
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
arr2[0] = 33;
arr2[1] = 44;
arr2[2] = 55;
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
- 上述代码所对应的内存图
- 加载进内存的详细步骤:
1.Test.class文件加载进方法区,main方法存放在字节码文件中;
2.main方法被JVM自动调用,进入栈内存执行;
3.arr1数组变量在main方法中声明;
4.通过new关键字在堆内存中开辟空间,并产生地址值,因为new的是长度为2的数组,所以会划分出2块小格子;
5.将地址值赋值给main方法中的arr变量;
6.输出数组名arr1存储的地址001,输出数组中存储的默认值;
7.修改数组arr1中的默认值;
8.输出数组arr1中的值;
9.arr2数组变量在main方法中声明;
10.通过new关键字在堆内存中开辟空间,并产生地址值;
11.将地址值赋值给main方法中的arr2变量;
12.输出数组名arr2存储的地址002,输出数组中存储的默认值;
13.修改并输出数组arr2中的值;
14.main方法执行完毕,弹栈,程序运行结束。
- 多个数组指向相同地址内存图
- Test.java文件:
public class Test{
public static void main(String[] args) {
int[] arr1 = new int[2];
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
arr1[0] = 11;
arr1[1] = 22;
System.out.println(arr1[0]);
System.out.println(arr1[1]);
int[] arr2 = arr1;
arr2[0] = 33;
System.out.println(arr2[0]);
System.out.println(arr2[1]);
}
}
- 上述代码所对应的内存图
- 加载进内存的详细步骤:
1.Test.class文件加载进方法区,main方法存放在字节码文件中;
2.main方法被JVM自动调用,进入栈内存执行;
3.arr1数组变量在main方法中声明;
4.通过new关键字在堆内存中开辟空间,并产生地址值,因为new的是长度为2的数组,所以会划分出2块小格子;
5.将地址值赋值给main方法中的arr变量;
6.输出数组名arr1存储的地址001,输出数组中存储的默认值;
7.修改数组arr1中的默认值;
8.输出数组arr1中的值;
9.arr2数组变量在main方法中声明;
10.将arr1存储的地址给arr2,即两个变量指向同一块地址;
11.修改数组arr2[0]的值;
12.输出数组arr2中的值
13.main方法执行完毕,弹栈,程序运行结束。