加班使我快乐!
点赞再看,养成习惯。
堆(Stack):
- 实际的对象被存储在堆内存中
- 创建的对象放在堆内存中,堆内存中的对象不会随着方法的结束而销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它
- 堆内存中的东西都有一个地址值。
- 堆内存中的数据都有默认值:
-
-
整数 默认为0
-
浮点数 默认为0.0
-
字符 默认为 '\u0000'
-
布尔 默认为false
-
引用类型 默认为null
-
栈(Heap):
- 对象的引用变量放在栈内存中
- 在所有方法中定义的局部变量放在栈内存中,随着方法的执行结束,这个方法的内存栈自然销毁
- 局部变量:方法的参数,或者是方法{}内部的变量
- 方法的运行一定要在栈当中运行
举个例子:
一个数组的内存图
方法区内保存的最主要的内容就是方法信息:方法名字、参数、返回值等等
将方法区main中的信息加载到栈内存,方法进栈。
变量array放在内存中。new出来的数组int[3]放在堆中,默认值为0,地址值假设为0x666,这个地址值会被赋值到左边变量中。实际上变量中存放的就是地址值,我们可以根据这个地址值在堆内存中找到数组在堆内存中的位置。
这里我改变了数组中的值,array[1]=10,根据array找到array数组在堆内存中的位置,找到array[1],重新赋值为10.
两个数组的内存图(同理)
两个引用指向同一个数组的内存图
拓展:
-
寄存器(pc Register):与CPU相关
-
本地方法栈(Native Method Stack):与操作系统有关
-
方法区(Method Area):存储.class相关信息,包含方法的信息
-
栈内存
-
堆内存