运行时数据区:
- 方法区
- 堆
- 虚拟机栈
- 本地方法栈
- 程序计数器
以及执行引擎和本地库接口—>本地库
方法区和堆所有线程共享
Java虚拟机栈
线程私有,生命周期与线程相同,每个方法被执行的时候,Java虚拟机会同步创建一个栈帧,当方法调用或执行完毕,就对应了栈帧的弹出
对象的创建
类加载检查-> 分配内存
1、此时要看Java堆中的内存是否规整(取决于虚拟机是否拥有空间压缩整理的能力),如果规整,则采用指针碰撞方式即可,否则,就必须维护一个空闲列表,并实时更新
2、对象创建十分频繁,并不是线程安全的,可能给A分配完内存后,指针来不及修改,对象B同时又使用了原来的指针分配内存。此时有两种解决方案,一种是对分配内存空间的操作进行同步处理采用CAS配上同步的方法保证更新操作的原子性,
内存分配完后,虚拟机必须将分配到的内存空间(不包括对象头)都初始化为0值
对象在堆中的存储布局分为对象头,实例数据和对齐填充
对象头包含两方面信息,第一类是用于存储对象自身的运行时数据,另一部分是类型指针
即对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类的实例
创建对象自然是为了引用对象,Java程序通过栈上的reference数据来操作堆上的具体对象,
主流的访问方式有两种:
1、句柄
2、直接指针 (速度快,但在垃圾回收时对象移动十分频繁)