java内存管理不简单,这里只简单介绍栈、堆、方法区三种,用来解释java程序的运行流程。
堆:
用来装载java对象
栈:
用来装载局部变量和方法的调用,每一个方法的调用载入一块栈帧,栈信息的出入原则与子弹夹类似,先进后出。
方法区:
存储一些公有信息,多个对象可能共同使用的信息,方法结构、静态变量等
使用下面程序作为例子:
class Dog{ String name; int age; public void bark(){ System.out.println("汪汪"); } } class TestDog{ public static void main(String[] args){ Dog d = new Dog(); d.name = "大黄"; d.age = 10; d.bark(); } }
1、装载类,方法区中有Dog类的方法信息
2、装载main方法,栈帧中出现main栈帧
3、执行new Dog赋值给d,堆中创造0x001对应对象连接到d,并且属性初始化值
4、d对象给name、age属性赋值,对象的成员变量值存储到对象中,方法不存储,引用数据类型存储的是引用地址
5、执行到bark()方法,在占中加入bark的栈帧,cpu执行权转到bark,输出汪汪
6、bark方法执行完毕,bark栈帧移除,cpu再次回到main方法
7、main方法执行完毕移除,d对象没有了对应变量连接,等待垃圾回收器处理。
注意点:
这里的方法调用没有参数,如果有参数的方法调用传递的参数实际上是实参的拷贝值。因为引用数据类型的值其实是对象的地址值,所以引用数据类型参数传递到方法中依旧能影响到同一个对象。
java程序执行有寄存器,有执行指针的类似概念,每个方法执行,就需要加入栈帧,执行完毕消亡则移除栈帧,当然栈帧中的局部变量一块消亡。
方法调用就是一种堆栈的形式,cpu永远先执行顶上的栈帧