一个对象的内存
首先要了解java中的内存分配机制
栈(stack):存放的都是方法中的局部变量,方法的运行在栈当中
局部变量:方法的参数,或者视方法体内部的变量
作用域:一旦超出作用域,立即从栈内存中消失
堆(Heap):凡是new出来的东西,都在堆当中。
堆内存里面的东西都有一个地址值:16进制的
堆内存里面的东西都有一个默认值。
方法区(Method Area):存储.class相关信息,包含方法的信息
本地方法栈(Native Method Stack):与操作系统相关
寄存器(pc register):与cpu相关
用一个手机对象为例细说对象内存
当程序运行的时候,首先方法区中会存放类的相关信息,和方法的相关信息
如图,程序中两个class信息都存在方法区,当new出来一个phone时,将它存放在堆内存里面,而我们调用one.什么什么的时候,这些都算是main方法中的局部变量,所以是存在于栈内存中的
程序中如果调用one.brand = “苹果”,他有2个步骤
1.该指令存放在栈里面
2.根据one对象的地址,到堆内存中寻找one对象的信息,再进行修改
当调用one.call(“乔布斯”)这个方法时,他有
1.该指令存放在栈里面
2.根据one对象的地址,到堆内存中寻找one对象的信息
3.根据one对象的方法的地址,到方法区中寻找具体的方法
4.将该方法指令压入栈内存中,然后执行,执行完毕就出栈
注意:
1.最开始main方法就是在栈中的,当main方法执行完毕,从栈中弹出,也就意味着程序运行完毕。
2.同一个类的不同对象的方法,是共用同一个方法区中的方法的,地址相同。