深入理解JVM(二)创建对象
2018-02-28 本文已影响0人
9cc222f2bb0a
1. 遇到new指令时,检查常量池,检查是否被加载,解析及初始化,没有则执行类加载过程。
2. 类加载检查通过后,分配内存地址,分配方式分为指针碰撞(内存规整,一个接一个)跟空闲列表(维护可用地址),是否规整则根据垃圾回收机制进行确定,标记清除显然属于空闲列表,能进行内存重置的则是指针碰撞
3. 如何解决并发问题?
方案一:同步处理。通过CAS(内存值,旧值的预期值,要改的值,版本戳)加上失败重试的机制保证原子性。
方案二:把分配内存的动作根据不同线程划分在预分配的空间中进行,分配空间用完之后,进行同步锁定,这块内存被称为TLAB(Thread Local Allocation Buffer 本地线程分配缓存),虚拟机是否使用,采用-XX:+/-UseTLAB 指定
4. 分配内存空间之后,将分配到的内存空间初始化零值,如果是TLAB模式,可以在预分配的时候初始化,这个步骤的目的是保证对象可以不赋值即可使用,程序访问到零值
5. 设置对象基本信息。将对象是那个类的实例,如何找到元信息,对象的哈希码,对象的GC分代年龄信息等放置到对象的头部信息(Object Header)中,对象头后面会进一步阐述。
6. 虚拟机的创建完成,程序进行对象初始化并赋值。