java对象内存图堆栈方法区
原文链接:https://blog.csdn.net/weixin_43153854/article/details/102683579
Java的内存需要划分成为5个部分:
- 栈(stack)
存放的都是方法中的局部变量。
方法的运行一定要在栈当中。
局部变量: 方法中的参数,或者方法{}内部的变量。
作用域: 一旦超出作用域,立刻从栈内存当中消失。
- 堆(heap)
凡是new出来的东西,都在堆当中。
堆内存里面的东西都有一个地址值:16进制
堆内存里面的数据,都有默认值。规则:
如果是整数 默认为0
如果是浮点数 默认为0.0
如果是字符 默认为’\u0000’
如果是布尔 默认为false
如果是引用类型 默认为null
- 方法区(method area)
存储.class相关信息,包含方法的信息。
- 本地方法栈(native method stack)
与操作系统相关。
- 寄存器(pc register)
与CPU相关。
- 一个对象的内存值图
图片解释:
方法区:保存的是.class数据(1 成员变量 2 成员方法 )程序就要启动在运行main之前,方法区要最先有数据。
栈: 谁有main方法的类从谁开始。main方法想要运行就要进栈,进入栈空间的动作叫进栈,也叫压栈。
堆 : 进栈之后干什么事,首先new 了一个对象Phone() 存在堆里,我怎么知道存了什么内容呢,参考着方法区的成员变量,成员方法拷贝来赋上默认值,注意:成员方法存的是地址值,指向了方法区。
call运行,也是要进栈的。打完了,方法就出栈,从栈内存消失。最后方法运行完毕,主方法退出。
两个对象的内存图
two是重新new的,只要改变一行代码,就能产生联系
即两个引用指向同一个对象的地址图
(对象,数组)