一、Javaの五大内存分配地:

  • 方法区
  • 本地方法栈
  • 寄存器

我们主要掌握栈和堆的分配规则。

java 类中方法的内存分配 java方法内存图_java

举个例子:

public static void main(String[] args) {
    int a = 5;
    int b = 10;
    int c = a + b;

    sout(c);
}

 现在分析栈和堆中的内存分配。(由于没有new什么东西,所以不需要考虑堆内存)

 栈中的内存分配情况为:

java 类中方法的内存分配 java方法内存图_数组_02

【说明】

1. 首先main函数先入栈

2. int a 表示在栈中分配一块int大小的内存,名字叫a。a=5表示内存中存放的值为5。

3. b同理。

4. int c = a+b; 首先分别要到a、b内存中去取出数字5和数字10,将其相加,相加后的结果存放在内存c中。

二、数组的内存图

1.代码

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]=12;
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);

        System.out.println("----------------------");

        int[] arr2 ={33,44,55};
        System.out.println(arr2);
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
    }

2.栈和堆中内存分配情况:

java 类中方法的内存分配 java方法内存图_赋值_03

【说明】

1. int[ ] arr1在栈里面定义了一个变量,变量的名字叫arr,类型int。

2. new int[2];在堆里面开辟了一个小空间,长度为2,索引为0、1。

3. 通过 “=” 将这个小空间的地址值赋值给arr,而arr通过地址值也能找到该小空间。

4. arr1[0]

5. arr2数组同理。

 总结:

        1. 只要是new出来的一定是在堆中开辟了一个小空间。

        2. 如果new出现了很多次,那么堆里面有很多个小空间,每个小空间中彼此独立。

三、两个数组指向同一个空间的内存图

1.代码

psvm(){
    int[] arr1 = {11,22};
    int[] arr2 = arr1;

    sout(arr1[0]);
    sout(arr2[0]);
    
    arr2[0] = 33;
    
    sout(arr1[0]);
    sout(arr2[0]);
}

2.运行结果:

java 类中方法的内存分配 java方法内存图_赋值_04

3.栈和堆的内存分配情况:

java 类中方法的内存分配 java方法内存图_数组_05

 【说明】

1. main方法进栈。

2. 在栈中定义arr1,在堆中开辟一个空间,里面存储11,22。再把空间的地址赋值给arr1,arr1可以通过地址找到该空间。

3. 在栈中定义arr2,把arr1所记录的内容赋值给了arr2,即把arr1的堆空间的地址赋给了arr2。所以arr1和arr2指向同一个堆空间。

4. arr2[0]=33;  将该地址空间的数组中索引为0的元素赋值为33。

5. arr1[0]和arr2[0]的值都变成了33。

 总结:当两个数组指向同一个堆空间时,如果其中一个数组对空间内的值进行赋值,那么另一个数组再次访问该空间,就是赋值后的结果了。