1.栈(Stack):存放的都是方法中的局部变量 。方法的运行一定要在栈当中。
局部变量:方法的参数,或者是方法{}内部的变量
作用域:一旦超出作用域(也就是{}),立刻从栈内存当中消失。
2.堆(Heap):凡是new出来的东西,都在堆当中。
堆内存里的东西都有一个地址值:16进制
堆内存里的数据,都有默认值。规则:
如果是整数 默认为0
如果是 浮点数默认为0.0
如果是字符 默认 ‘\u0000’
如果是布尔 默认为false
如果是引用类型 默认为null
3.方法区(Method Area):储存.class相关的信息,包含方法的信息
4.本地方法栈(Native Method stack)与操作系统相关。
5寄存器(pc Register):与CPU相关
下面我为大家举一个例子
main 方法是程序的入口, 在方法区里面通过mian(String[] args)进入到栈中,因为方法都是在栈中运行,堆中存的是new 出来的东西,所以开辟了一块内存空间并生成一个地址,里面存了成员变量和成员方法,并为成员变量赋值默认值。但是堆是怎么知道的 new Phone();里面存了什么东西呢?这时候堆会通过方法区找到 Phone.class,看里面有什么东西,堆一看Phone.class发现它里面存的有成员变量和成员方法,把它们拿过来。堆中的成员方法存的是地址值和方法区里面的成员方法是同一个的地址
当phone对象调用成员变量时,会根据对象储存的地址在堆中找相同的地址并为它们赋值。当phone对象调用成员方法时,找到堆中成员方法的地址值,堆根据地址值在方法区里面找相同的地址值并调用这个方法,然后成员方法进栈 也称为压栈,当成员方法执行结束后,就会立刻消失*。****