JAVA内存原理(数组为例)

JVM内存管理

内存在计算机、智能手机中非常重要,用于运行程序,在买电脑、买手机时,都会买内存较大的

Java虚拟机要运行程序,也需要内存,需要要对内存进行分配和管理

Java的内存划分为5个部分:

  1. 栈(stack):存放的都是方法中的局部变量。方法的运行一定在栈当中运行。
    • 局部变量:方法的参数,或者是方法{}内部的变量
    • 作用域:一旦超出作用域,立刻从栈内存当中消失。
  2. 堆(heap):new出来的东西,都存放到堆中
    堆内存的东西都有一个地址值:16讲制
    堆内存的数据,都有默认值:
    • 整数,默认为0
    • 浮点数,默认为0.0
    • 字符型:每个元素的值都为'',ASCII码中0位置的字符,即空字符
    • 布尔型,每个元素的值都为false
    • 引用类型,默认为null
  3. 方法区( Method Area):有储clas相关信息,包含方法的信息。
  4. 本地方法栈( Native Method Stack):与操作系统相关。
  5. 寄存器( 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]);
}

如上图:不同的变量名,指同一个对象

理解:
古人有姓名、有字、有号,但都是指同一个人,如:诸葛亮、孔明、卧龙先生,都是指同一个人