浅析new一个对象的过程

简介

在进行Java编程时,我们通常需要通过new创建一个对象的实例。

Object obj = new Object();

做了三件事

(1)为对象创建了对象空间;

(2)调用类的构造方法;

(3)将生成对象的地址返回。

具体步骤

1,首先到常量池中找类的带路径全名,然后检查对应的字节码是否已被加载,解析,验证,初始化,如果没有先执行类加载过程(class.forname())。

2,类加载过程完成后,虚拟机会为对象分配内存。分配内存有两种方式,根据使用的垃圾收集器的不同使用不同的分配机制。

(1)指针碰撞,当虚拟机使用复制算法或标记整理算法实现的垃圾收集器时,内存区域都是规整的,这时候使用指针碰撞分配内存,用过的内存放在一边,空闲的内存在另一边,中间用一个指针作为分界点,当需要为新对象分配内存时只需把指针向空闲的一边移动一段与对象大小相等的距离。

(2)空闲列表,当虚拟机使用标记清除算法实现的垃圾收集器时,内存都是碎片化的,那虚拟机就要记录哪块内存是可用的,当需要分配内存时,找一块足够大的内存空间给对象实例,并更新记录。

3,设置对象头信息,如所属类,元数据信息,哈希码,gc分代年龄,等等。

4,调用对象的init()方法,根据传入的属性值给对象属性赋值。

5,在线程栈中新建对象引用,并指向堆中刚刚新建的对象实例。

注意

如果类首次加载及new对象:
1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。 (静态函数只初始化,函数被动调用,代码块是主动调用)
2、执行子类的静态代码块和静态变量初始化。

开始new对象

3、执行父类的实例变量初始化
4、执行父类的构造函数
5、执行子类的实例变量初始化
6、执行子类的构造函数

如果类已经被加载及new对象:
则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。

如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想!

架构殿堂

你可能感兴趣的:(java基础,java)