虚拟机在遇到new指令的时候,会首先检查类是否被类加载器加载,如果没有,那先执行类加载过程。 简单来说就是class通过相应的ClassLoader加载进入JVM的运行时数据区。
new 对象的时
①检查加载,检查JVM常量池中是否有存在相同的类引用,存在则表示已经被类加载器加载过,否则没有需要先执行类加载过程。
②为对象分配内存,可能会在堆或栈中(逃逸分析)。过程又存在指针碰撞(内存规则时)或空闲列表(内存不规整时)、并发安全问题的解决(CAS重试、本地线程缓冲)
③内存分配后,对内存空间进行初始化(如int 0,boolean false),保证对象的实例字段不赋值初始值就可以直接使用。
④对对象中进行信息设置,如对象属于哪个类的实例,类的元数据信息、对象的哈希码、对象的GC分代年龄、锁状态等信息。设置对象头中的这些信息。
⑤对象初始化,通过相应的构造方法产生相应的对象。
网友评论