java对象创建过程详解(java对象创建的过程)
导语:Java对象创建过程
·new&类加载检测
当遇到new指令时,JVM首先会进行类加载检测:
①检测new指令的参数是否能在常量池中定位类的符号引用;
②检测这个符号引用是否进行过加载解析和初始化,没有则先对该类进行类加载。
·对象内存分配
创建一个对象所需要的内存在类加载完成时就能确定,内存分配是指在堆中划出一块和对象大小的对应内存出来,具体的分配方式根据堆内存的整齐性决定,而堆内存的整齐性则由当前程序采用GC机制决定。
分配方式:①指针碰撞(堆整齐) ②空闲列表(堆不整齐)
分配出现并发情况解决方案:①CAS自旋 ②TLAB本地内存
·值初始化
JVM初始化分配好的内存,将其设为零值(不包括对象头,如果使用了TLAB,这一步会提前到内存分配阶段进行)。
·设置对象头
完成初始化操作后接着会对于对象的对象头进行设置:
①mrakword:存储对象自身的运行时数据,如hashcode、GC分代年龄、锁标志、锁信息等;
②klassword:类型指针,指向它对应的类元数据,JVM用这个确定其属于哪个类的实例。
·执行init函数
最后执行<init>函数,主要是对属性赋值。
·TLAB分配
TLAB(Thread Local Allocation Buffer,即线程本地分配缓存),是一块线程专用的内存分配区域。TLAB占用的是eden区的空间,在TLAB启用的情况下(默认开启),JVM会为每一个线程分配一块私有缓冲区域,即为TLAB内存区域。栈上分配与TLAB分配区别:
①栈上分配使用的是栈来进行对象内存的分配
②TLAB分配使用的是eden区域进行内存分配,实际还是属于堆内存
③栈上分配优先于TLAB分配,逃逸分析中若可进行栈上分配优化,会优先栈上分配内存
④当无法进行栈上直接分配时,则会进行TLAB分配
JVM中TLAB相关参数:
其中,-XX:TLABRefillWasteFraction指当TLAB空间不足,请求分配的对象内存大小超过此阈值时不会进行TLAB分配,直接进行堆内存分配,否则还是进行TLAB分配。
TLAB的意义:加速对象的分配。因为对象一般分配堆内存,而堆是线程共享的,在多线程环境下,可能会有多个线程同时在堆上申请空间,导致空间分配需要线程同步,会使分配的效率下降。TLAB是Java Hotspot编译器对于new对象的优化,为每一个线程都在Eden区中分配了一块专享空间供线程使用。
·对象成员分配内存后初始化顺序
①处于并列优先级的按照Java程序编写时代码的先后顺序加载
②前面两步为静态过程,程序运行过程中只会执行一次,之后再次创建该类或该子类的对象时并不会再次执行。
本文内容由小曲整理编辑!