1. java内存分配
- 栈:方法运行时使用的内存,比如main ()方法运行,进入栈中运行。方法开始执行时会进栈,代码执行完毕会出栈。
- 堆:存储对象或者数组,用new关键字来创建的,都存储在堆中。new出来的东西会在这块内存中开辟空间并产生地址。
- 方法区(元空间):存储可以运行的.class文件(字节码文件)。当一个类要开始运行时,就会把这个类的字节码文件加载到方法区中,临时存储。
- 本地方法栈:JVM在使用操作系统功能的时候使用,和我们开发无关
- 寄存器:给cpu使用,和我们开发无关
- 注意:从JDK8开始,取消了方法区,新增元空间,把原来方法区的多种功能进行拆分,有的功能放到了堆中,有的功能放到了元空间中。
2. 数组的内存图
- 变量里存储的是具体的数值,且这个具体的数值就存储在栈内存的一块小空间中,当方法运行结束出栈时,方法里的变量也随之消失。
- 数组名里存储的是堆内存中的一块空间的地址值,这块空间用来存储数组里的数据。
例如:arr[1] 先通过arr(数组名)存储的地址值,找到该数组在堆内存中具体位置,再通过1索引找到该数组的第二个数据。
总结:
a. 只要是new出来的一定是在堆内存里面开辟了一个小空间。
b. 如果new了多次,那么堆里面有多个小空间,每个小空间中都有各自的数据,且相互独立。
c. 当两个数组指向同一个小空间时(即两个数组名存储的是同一个地址值),其中一个数组对小空间中的值进行了改变,那么其他数组再次访问的时候都是修改之后的结果了。