Java中的内存划分,一个数组的内存图,两个数组的内存图,两个引用指向同一个数组的内存图

1、Java中的内存划分

Java的内存需要分成5个部分:

栈(Stack)

存放的都是 方法 中的 局部变量方法的运行一定要在栈当中运行。

局部变量:方法的参数,或者是方法{}内部的变量

作用域:一旦超出作用域,立刻从栈内存当消失。

通常所说的栈,是指 虚拟机栈。虚拟机栈用于 存储局部变量 等。局部变量表存放了编译期可知长度的各种数据类型(boolean,byte,char,short,int,float,long,double),对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放。

堆(Heap)

凡是 new 出来的东西,都在堆当中。

堆内存里面的东西都是一个地址值:16进制

堆内存里面的数据,都有默认值。规则:

如果是整数        默认为0

如果是浮点数     默认为0.0

如果是字符         默认为'\u0000'

如果是布尔         默认为false

如果是引用类型  默认为null

此内存区域的唯一目的就是 存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。

方法区(Method Area)

存储.class相关信息,包含方法的信息。

用于存储已被虚拟机加载的 类信息常量静态变量即时编译器编译后的代码 等数据。

本地方法栈

(Native Method Stack)

与操作系统相关。
寄存器(pc Register)与CPU相关。

 

 2、一个数组的内存图

public class Demo01ArrayOne {
    public static void main(String[] args) {
        int[] array = new int[3]; //动态初始化
        System.out.println(array); //地址值
        System.out.println(array[0]); //0
        System.out.println(array[1]); //0
        System.out.println(array[2]); //0
        System.out.println("=================");

        //改变数组当中元素的内容
        array[1] = 10;
        array[2] = 20;
        System.out.println(array); //地址值
        System.out.println(array[0]); //0
        System.out.println(array[1]); //10
        System.out.println(array[2]); //20
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=3614:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\variableandoperator Demo01ArrayOne
[I@776ec8df
0
0
0
=================
[I@776ec8df
0
10
20

Process finished with exit code 0
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 3、两个数组的内存图

public class Demo02ArrayOne {
    public static void main(String[] args) {
        int[] arrayA = new int[3];
        System.out.println(arrayA); //地址值
        System.out.println(arrayA[0]); //0
        System.out.println(arrayA[1]); //0
        System.out.println(arrayA[2]); //0
        System.out.println("=================");
        arrayA[1] = 10;
        arrayA[2] = 20;
        System.out.println(arrayA); //地址值
        System.out.println(arrayA[0]); //0
        System.out.println(arrayA[1]); //10
        System.out.println(arrayA[2]); //20

        int[] arrayB = new int[3];
        System.out.println(arrayB); //地址值
        System.out.println(arrayB[0]); //0
        System.out.println(arrayB[1]); //0
        System.out.println(arrayB[2]); //0
        System.out.println("=================");
        arrayB[1] = 100;
        arrayB[2] = 200;
        System.out.println(arrayB); //地址值
        System.out.println(arrayB[0]); //0
        System.out.println(arrayB[1]); //100
        System.out.println(arrayB[2]); //200
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=4940:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\variableandoperator Demo02ArrayOne
[I@776ec8df
0
0
0
=================
[I@776ec8df
0
10
20
[I@4eec7777
0
0
0
=================
[I@4eec7777
0
100
200

Process finished with exit code 0

 

 4、两个引用指向同一个数组的内存图

public class Demo03ArraySame {
    public static void main(String[] args) {
        int[] arrayA = new int[3];
        System.out.println(arrayA); //地址值
        System.out.println(arrayA[0]); //0
        System.out.println(arrayA[1]); //0
        System.out.println(arrayA[2]); //0
        System.out.println("=================");
        arrayA[1] = 10;
        arrayA[2] = 20;
        System.out.println(arrayA); //地址值
        System.out.println(arrayA[0]); //0
        System.out.println(arrayA[1]); //10
        System.out.println(arrayA[2]); //20

        int[] arrayB = arrayA;
        System.out.println(arrayB); //地址值
        System.out.println(arrayB[0]); //0
        System.out.println(arrayB[1]); //10
        System.out.println(arrayB[2]); //20
        System.out.println("=================");
        arrayB[1] = 100;
        arrayB[2] = 200;
        System.out.println(arrayB); //地址值
        System.out.println(arrayB[0]); //0
        System.out.println(arrayB[1]); //100
        System.out.println(arrayB[2]); //200
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=6276:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\variableandoperator Demo03ArraySame
[I@776ec8df
0
0
0
=================
[I@776ec8df
0
10
20
[I@776ec8df
0
10
20
=================
[I@776ec8df
0
100
200

Process finished with exit code 0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值