Java内存原理(数组内存,方法内存,对象内存)

Java内存概述

Java内存分配主要是5个部分

JDK8之前:主要是栈;堆;方法区;本地方法栈;寄存器

JDK8以后:取消方法区,新增元空间。把原来方法区的多种功能进行拆分,有的功能放到了堆中,有的功能放到了元空间中。

每个部分的作用是

(1)栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行

(2)堆:存储对象或者数组,new来创建的,都存储在堆内存

(3)方法区:存储可以运行的class文件(当加载一个类时,这个类的字节码文件就会被加载到方法区)

(4)本地方法栈:JVM在使用操作系统功能的时候使用,(与开发无关)

(5)寄存器:给CPU使用,(与开发无关)

以一张图示意:

在这里插入图片描述

数组内存

(1)创建数组

数组是new出来的,所以一定是在堆里面开辟了一个小空间,在栈内存中只是地址(所以控制台直接输出数组时输出的是地址值)。如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据。

在这里插入图片描述

(2)两个数组指向同一个空间的内存图
在这里插入图片描述

如果发生数组赋值时,即两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了。

方法内存

方法被调用后就会进入栈

1. 方法传递基本数据类型

传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值

在这里插入图片描述

在方法调用后,方法参数number随之消失,最后输出的number还是100

2. 方法传递引用数据类型

传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值

在这里插入图片描述

在方法调用后,最后输出arr[1]=200(引用数据类型,指向了同一地址空间)

对象内存

1.一个对象的内存

当创建一个对象时

Student s = new Student()

内存里面一般会执行这几件事:

(1)加载class 文件(new Student()

(2)申明局部变量(Student s

(3)在堆内存中开辟一个空间(new后就需要在堆内存中开辟)

(4)默认初始化(给局部变量赋默认值如null,0等)

(5)构造方法初始化(空参构造或者有参构造)

(6)将堆内存中的地址值赋值给左边的局部变量(如果此时输出s输出的就是地址值)

如下图:

在这里插入图片描述

2.两个对象的内存

多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份(在堆中不同地址,但是指向方法区同一位置)

在这里插入图片描述

3.两个引用指向同一个对象

当出现对象赋值时,即两个引用指向同一个对象,那么此时两个对象指向同一个堆内存空间。当一个对象修改了成员变量值时,那另一个对象的成员变量值也会发生改变(与上面的两个数组指向同一个空间时)

在这里插入图片描述

this的内存原理

首先回顾一下this的作用,他是来区分局部变量和成员变量的

在这里插入图片描述

this的本质:代表方法调用者的地址

在这里插入图片描述
在这里插入图片描述

参考链接:https://www.bilibili.com/video/BV17F411T7Aop=87&vd_source=38cb30e60861b967d6cdfa51ce1c31fa

猜你喜欢

转载自blog.csdn.net/ji_meng/article/details/127224185
今日推荐