在java中 字节码new 表示创建对象
当虚拟机遇见该指令时
会从栈顶取得目标对象在常量池中的索引,接着定位到目标对象的类型。
然后虚拟机根据该类的状态,采取相应的分配技术,在内存中分配实例空间,并完成示例数据和对象头的初始化
这样一个对象在jvm中就创建好了。
具体创建流程图
首先获取对线类型信息并验证是否解析过,若通过采用快速分配
否则慢速分配
实例的创建流程图
(1)验证类已被解析
(2)获取instanceKlass 并确保已经被初始化
(3)根据状态采取相应的分配措施
快速分配
若其他符合 分配只是在内存空间中划分可用内存,可以较高效率分配内存
分配空间分为线程私有空间 共享的内存堆空间
HotSpottongue线程局部分配空间技术 ThreadLocal Allocation Buffers 简称TLAB可以在线程私有空间分配
VM参数 UseTLAB 来关闭或开启
选择TLAB 尝试分配 不需要枷锁 若果失败 则尝试枷锁在Eden区分配
选择Eden区失败 则尝试在Eden共享区分配
因为共享需要保证线程安全 所以采用原子操作进行分配 若失败 尝试到成功为止。
分配成功后开始初始化 根据vm选项 zeroTlab对实例空间填零 默认false
接下来初始化对象头
(1)设置Mark Word
(2)设置类元数据指针 根据vm选项采取相应(压缩)措施
完成了空间分配和初始化 可以设置栈顶对象的引用
慢分配
需要在分配实力前 对类进行解析 确保类及依赖类得到正确的解析和初始化
调用InterpteterRuntime模块_new()进行的 可以分为单独一片 后面有机会再更新
1.确保初始化类不是抽象类
2.确保类已初始化
3.分配实例
4.在线程中设置对象引用
实战探测jvm内部对象 后面再更新