栈(stack),位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。存储读取速度,仅次于寄存器。存放基本类型数据变量和对象、数组等引用类型的引用!
栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在虚拟机栈里面从入栈到出栈(也叫弹栈)的过程。
对于栈,只有栈顶的栈帧是有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法。执行引擎所运行的所有字节码指令都只针对当前栈帧进行操作。
堆(heap),是一种通用性的内存池(也存在于RAM中),用于存放所有的JAVA对象!
各存储空间就速度来说,有如下关系:寄存器 >堆栈 > 堆 > 其它。
栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器gc负责回收。
结合实例:Student student=new Student();JVM在内存中偷偷的做了什么?
加载Student.class文件进入内存
在栈内存中为student开辟空间,栈内存中的局部变量表中存放student变量
在堆内存中为学生对象开辟空间
学生对象的成员变量默认初始化(无参构造方法)
学生对象的成员变量显示初始化(有参构造方法)(若没有就不执行)
通过构造代码块对学生对象进行初始化(若没有就不执行)
通过构造方法对学生对象进行初始化(通过构造方法对学生对象的成员变量赋值)
对象初始化完毕
学生对象初始化完毕后,向外抛出产生的对象地址
让变量student指向学生对象。