JVM中的对象
划分对象 两种方式: 指针碰撞:java内存空间规整的请款下使用 空闲列表:java内存空间不规整的请款下使用 并发安全问题:频繁创建对象就会存在线程不安全问题。解决方案有两种: 1.对分配内存空间的操作进行同步处理,CAS加失败重试机制保证保证更新操作原子性。 2.分配缓冲:给每个线程分配独立空间(Java堆中申请一小块私有内存),也就是本地线程分配缓冲(Tread Local Allocation Buffer,TLAB),开启 -XX:+UseTLAB,在自己Buffer分配,空间不够重新在Eden区申请一块继续使用。 TLAB可以让每个应用线程拥有专属的分配指针来分配空间(Eden区,默认Eden的1%),减小同步开销。 TLAB只是让每个线程有私有的分配指针,但底下存对象的内存空间还是给所有线程访问的,只是其他线程无法在这个区域分配而已。当一个TLAB用满(分配指针top撞上分配极限end了),重新申请一个TLAB. 对象内存布局 在HotSpot虚拟机中,对象的内存布局分为:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding) 对象头分配两部分,一是自身运行时数据(哈希吗HashCode)、GC分带年龄、锁状态标志、线程持有锁、偏向线程ID、偏向时间戳等。 另一种类型指针,即只想它的类元素指针,虚拟机通过这个指针来确定是哪个类的实例