在创建对象的时候,可能会出现的问题和解决方法
分配内存的方法:
1.指针碰撞 通过寻找指针碰撞查找出空闲的区域。
2.空闲列表,定义一个表来记录空闲区域(或者占用区域),这样就可以达到分配空间的目的
分配内存的时候出现的问题:
多线程回去调用对象,导致一个对象在堆中多次分配空间,造成内存溢出。或者出现一个对象多次分配同一块堆区域。
解决方法:
1.线程同步;
2.本地线程分配缓存法:给每个线程指定操作不同的堆区域,如果该区域满了,就可以加上同步。
对象的结构
Header(对象头)
1:自身运行时的数据(Mark Word)
哈希值 GC分代年龄 锁状态标识 线程持有锁 偏向线程ID 偏向时间戳
2:类型指针
InstanceData (数据的实例)
数据长度类似的会分配到同一片堆区域中 例如: Longs Doubles shorts/chars
padding
占位符,对象的大小必须是8的整数倍,如果没有达到这个倍数,padding就来进行填充
对象的访问定位
1.使用句柄 指向堆中的一块区域(句柄池)。做了个中间的连接,句柄池存在指向真正地址内存区域。
2.直接指针 引用类型直接指向真正的地址内存区域 (Hotspot目前采用的方式)