Java创建对象的过程(类实例化)
1.检查类是否被加载。 当虚拟机遇到new指令后,会先去常量池检查有没有该类的符号引用,并且检查这个类有没有进行加载、解析、初始化过,没有就先执行类加载过程。 2.为对象分配内存空间*。 在完成类加载后,对象的内存大小就已经确定了。此时为对象分配内存就是在Java堆中划分出一块确定大小的内存。 划分方式有 指针碰撞 和 空闲列表 两种方式,使用哪种由Java堆是否齐整决定,而Java堆的齐整与否又由使用哪种 GC算法决定。 3.初始化对象。 分配完内存后,虚拟机会将分配的内存空间除对象头以外进行初始化零值。 4.设置对象头。 (对象头的内容..?) 虚拟机需要对对象进行必要的设置。如该对象是哪个类的实例、这个类的元数据信息、对象的哈希吗、对象的GC分代年龄等。 此外,根据虚拟机运行状态的不同(如是否使用偏向锁),对象头的设置都有所不同。 5.执行init()。 进行完上述操作,对于虚拟机而已这个对象是创建好了,但对于java而言才刚开始,一切字段都为0,还需执行init进行初始化,这样一个对象才算真正被创建。 内存分配的两种方式: · 指针碰撞:(适用于堆规整,无内存碎片的情况下)用过的内存在一边,没用过的在另一边g是可用的,然后在没有使用过的内存中找出符合大小的内存空间。最后更新列表。 内存分配并发问题: 虚拟机使用两种方式为了保证创建对象时线程安全: · TLAB