知道new⼀个对象的过程吗?

2022-04-30  本文已影响0人  嘘寒问暖

类加载过程

当虚拟机遇⻅new关键字时候,实现判断当前类是否已经加载,如果类没有加载,⾸先执⾏类的加载机制,加载完成后再为对象分配空间、初始化等。

1. ⾸先校验当前类是否被加载,如果没有加载,执⾏类加载机制

2. 加载:就是从字节码加载成⼆进制流的过程

3. 验证:当然加载完成之后,当然需要校验Class⽂件是否符合虚拟机规范,跟我们接⼝请求⼀样,第⼀件事情当然是先做个参数校验了

4. 准备:为静态变量、常量赋默认值

5. 解析:把常量池中符号引⽤(以符号描述引⽤的⽬标)替换为直接引⽤(指向⽬标的指针或者句柄等)的过程

6. 初始化:执⾏static代码块(cinit)进⾏初始化,如果存在⽗类,先对⽗类进⾏初始化

Ps:静态代码块是绝对线程安全的,只能隐式被java虚拟机在类加载过程中初始化调⽤!(此处该有问题static代码块线程安全吗?)当类加载完成之后,紧接着就是对象分配内存空间和初始化的过程

1. ⾸先为对象分配合适⼤⼩的内存空间

2. 接着为实例变量赋默认值

3. 设置对象的头信息,对象hash码、GC分代年龄、元数据信息等

4. 执⾏构造函数(init)初始化

上一篇下一篇

猜你喜欢

热点阅读