对象的创建
首先对象的创建一般都是碰到一个new关键字,首先虚拟机去看常量池里面有没有那个类的符号引用,
然后去检查是否做了加载解析初始化,如果这些都ok,那么就开始分配内存。
内存分配的策略:
1.指针碰撞法
2.空闲链表法
对象分配可能存在的问题:
当刚给A对象分配了内存之后但是还没来得及给引用赋地址,那么B又来了。就产生了同步的问题。
解决方法:
1.虚拟机CAS+失败重试的机制
2.TLAB thread local allocation buffer 每个线程分配一小块内存为tlab,
哪个线程分配内存就在tlab上分,当tlab满了并分配新的内存的时候采取做同步锁定。
对象的设置:元数据信息,哈希码,GC分代年龄等信息。
对象的内存布局
第一部分存储对象自身的运行时数据。
第二部分类型指针。
对象的访问定位
句柄和直接指针的两种方式。
1.reference指向的是句柄池的句柄地址,句柄地址包括对象的实例数据的指针和对象
的类型数据的指针,实例数据同在堆中,类型数据在方法区中。
2.直接引用指向的是对象实例数据+对象类型数据的指针(指向方法区的类型数据)。
各自的优缺点:
使用句柄的方式的话引用指向的地址就很稳定,实例数据和类型数据的地址改变不会影响引用
使用直接引用的方式的话就是少一次指向对象实例数据的搜索,更快。