注1: Java堆是否规整由垃圾收集器是否带有压缩整理功能所决定。如Serial、ParNew等带有Compact的收集器,分配方式为指针碰撞;而CMS这种基于Mark-Sweep算法的收集器,分配方式为空闲列表。
注2: 并发线程安全问题。两种解决方案。一种是对分配内存空间的动作进行同步处理——采用CAS加上失败重试的方式保证更新操作的原子性;另一种是使用TLAB让内存分配动作在各线程内单独进行,只有TLAB用完并分配新的TLAB时才需要同步锁定。
注: 如果使用TLAB,该过程可以提前至TLAB分配时进行。
注: 对象头信息包括两部分信息(对象头为对象内存布局三部分中的其中之一,其他为实例数据和对齐填充)。 第一部分用于存储对象自身的运行时数据,如HashCode、GC分代年龄、锁状态标志、线程持有的锁等,即Mark Word(非固定大小)。 第二部分是类型指针,即对象指向它的类元数据的指针。 如果对象为Java数组,对象头中还必须有一块用于记录数组长度的数据。
<init>
方法:一般来说,执行new指令之后会接着执行<init>
方法,把对象安装程序员的意愿进行初始化。至此,对象创建完成。新闻热点
疑难解答