对象的创建
过程:new一个对象,根据new的参数在常量池中定位一个类的符号引用;如果没有,说明类还没被加载,则进行类的加载、解析和初始化;然后为对象分配内存;将内存初始化为零值(不包括对象头);调用init方法。
一些问题(从分配内存开始):
- 给对象分配内存(决定于GC是否能整合内存空间)
1、指针碰撞(针对一块完整的内存空间)
2、空闲列表(碎的内存空间) - 线程安全性问题(针对内存分配过于频繁)
1、线程同步
2、本地线程分配缓冲(Thread Local allocation buffer):不同线程访问不同的内存区域,加入某个区域满了,则采用同步策略。 - 初始化对象
- 执行初始化方法(构造方法,代码块等等)
对象的结构
- Header(对象头)
1、自身运行时数据(Mark Word):哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。
2、类型指针 - InstanceData(我们看到的 数据实例)
- Padding(起一个内存缓冲的作用,无实际意义)
对象的访问定位
- 句柄访问
- 直接指针