资源
jvm虚拟机模型
- 对象的创建
当虚拟机遇到一条字节码的new命令时,首先将区检查这个指令是否以及在常量池中,可以定位到一个类的符号引用,并且检查引用的类是否被加载、解析与初始化过。如果没有,就将执行相应的类加载过程。
类检查通过后将进行给新生的对象分配内存,内存的大小在的加载后就可以确定。就是将一块确定大小的内存从java堆中划分出来。采用指针碰撞的方式。 - 解决对线程创建在并发情况下的线程安全,通过这两个方法
(1)对分配的内存空间动作进行同步处理–实际上虚拟机采用的是CAS配上失败重试的方式来保证更新操作的原子性。
(2)另外一个是将内存分配的动作按照线程划分为不同的空间进行,预分配空间给每个线程,即本地缓冲区(TLAB) - 内存分配完毕后将初始化零值
- 对象的创建内存布局
对象可以划分为三个部分,对象头,实例数据,对其填充。
Hotspot虚拟机对象的对象头包括两类信息:
(1)是存储对象自身运行时数据,如hashcode、GC分代年龄、锁状态的标志等。
(2)另外一部分是类型指针,通过指针来确定该对象是那个类的实例。 - 对象的访问定位
兑现的方法的访问方式有句柄访问与直接指针两种
(1)句柄访问时在java堆中划分出一块内存做句柄池,reference是对象的句柄地址,句柄中包含对象的实例数据与类各自的地址
(2)直接指针式reference中存储的直接是对象的地址,减少一次访问开销