JVM内存管理
内存在计算机、智能手机中非常重要,用于运行程序,在买电脑、买手机时,都会买内存较大的
Java虚拟机要运行程序,也需要内存,需要要对内存进行分配和管理
Java的内存划分为5个部分:
- 栈(stack):存放的都是方法中的局部变量。方法的运行一定在栈当中运行。
- 局部变量:方法的参数,或者是方法
{}内部的变量 - 作用域:一旦超出作用域,立刻从栈内存当中消失。
- 局部变量:方法的参数,或者是方法
- 堆(heap):new出来的东西,都存放到堆中
堆内存的东西都有一个地址值:16讲制
堆内存的数据,都有默认值:- 整数,默认为0
- 浮点数,默认为0.0
- 字符型:每个元素的值都为
'',ASCII码中0位置的字符,即空字符 - 布尔型,每个元素的值都为false
- 引用类型,默认为null
- 方法区( Method Area):有储clas相关信息,包含方法的信息。
- 本地方法栈( Native Method Stack):与操作系统相关。
- 寄存器( pc Register):与CPU相关。
例子
内存中的数组
一个数组内存图
public static void main(String[] args) {
int[] arr = new int[3];
arr[0]=10;
arr[1]=20;
arr[2]=30;
System.out.println(arr);//[I@5f150435
}
执行结果:类似[I@5f150435,这个是数组在 内存中的地址。
new出来的内容,都是在堆中存储
两个数组内存图
public static void main(String[] args) {
int[] arr = new int[3];
arr[0]=10;
arr[1]=20;
arr[2]=30;
int[] arr2 = new int[2];
arr2[0]=100;
arr2[1]=200;
System.out.println(arr);
System.out.println(arr2);
}
变量指向另一个数组
public static void main(String[] args) {
// 定义数组,存储3个元素
int[] arr = new int[3]; //数组索引进行赋值
arr[0]=10;
arr[1]=20;
arr[2]=30;
//输出3个索引上的元素值
System.out.println(arr.length);
System.out.println(arr);
//定义数组变量arr2,将arr的地址赋值给arr2
int[] arr = new int[2];
arr[0]=100;
arr[1]=200;
System.out.println(arr.length);
System.out.println(arr);
变量 arr 开始指向数组 new int[3],当执行int[] arr = new int[2];时,不在指向之前的数组,而是指向了new int[2]
理解
007代号只有一个,但是扮演者可以有很多,更换演员后,007这个代号就不在指向上一个扮演者,而是指向当前扮演者
两个变量指向一个数组
public static void main(String[] args) {
// 定义数组,存储3个元素
int[] arr = new int[3]; //数组索引进行赋值
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
//定义数组变量arr2,将arr的地址赋值给arr2
int[] arr2 = arr;
//输出3个索引上的元素值
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
如上图:不同的变量名,指同一个对象
理解:
古人有姓名、有字、有号,但都是指同一个人,如:诸葛亮、孔明、卧龙先生,都是指同一个人




