一.java内存分配:
1. 栈:方法运行时使用的内存,比如main方法运行,进入方法栈中进行,代码执行完毕会出栈
2. 堆:存储对象或者数组,new来创建的,都存储在堆内存并产生地址值,每一块空间的地址值都是不一样的
3. 方法区(元空间):存储可以运行的class文件
4. 本地方法栈:jvm在使用操作系统功能的时候使用,和我们开发无关
5. 寄存器:给cpu使用,和我们开发无关
注意:方法区之前是和堆连接在一起的,从JDK8开始,取消方法区,新增元空间;把原来方法区的多种功能进行拆分,有的功能放到了堆当中,有的功能放到了元空间中
数组的内存图:
解释:
首先main方法进栈,开始执行第一行的代码,创建一个名字叫arr的动态数组,并在堆内存中开辟了一个小空间,打印数组其实打印的是数组的地址值,由于没有给数组添加元素,所以一开始打印arr数组中的元素都是int类型默认的0;后面给arr数组0索引和1索引的元素进行赋值,原先的0就被覆盖了,后面打印出来的就是我们赋值的值;然后打印了”———-“, 再创建了一个静态数组arr2,并添加了三个元素,打印数组arr2其实就是打印数组的地址值,最后打印arr2中0索引,1索引和2索引的三个元素
总结:
1. 只要是new出来的一定时在堆里面开辟了一个小空间
2. 如果new可多次,那么堆里面有多个小空间,每个小空间中都有各自的数据