问题解答
编辑
(如图)在实例化一个对象的时候,JVM首先会去检查目标对象是否已经被加载并初始化了。
如果没有,JVM需要立刻去加载目标类,然后调用目标类的构造器完成初始化。目标类的加载是通过类加载器来实现的,主要就是把一个类加载到内存里面。
然后初始化的过程,主要是对目标类里面的静态变量、成员变量、静态代码块进行初始化。
当目标类被初始化以后,就可以从常量池里面找到对应的类元信息,并且目标对象的大小在类加载之后就已经确定了,所以这个时候就需要为新创建的对象,根据目标对象的大小在堆内存里面分配内存空间。
内存分配的方式一般有两种,一种指针碰撞,另一种是空闲列表,JVM会根据Java堆内存是否规整来决定内存分配方式。
接下来,JVM会把目标对象里面的普通成员变量初始化为零值,比如int类型初始化为0,对象类型初始化为null,类变量在类加载的准备阶段就已经初始化过了。
这一步操作主要是保证对象里面的实例字段,不用初始化就可以直接使用,也就是程序能够获得这些字段对应数据类型的零值。
然后,JVM还需要对目标对象的对象头做一些设置,比如对象所属的类元信息、对象的GC分代年龄、hashcode、锁标记等等。
完成这些步骤以后,对于JVM来说,新对象的创建工作已经完成。但是基于Java语言来说,对象创建才算是开始。
接下来要做的,就是执行目标对象内部生成的init方法,初始化成员变量的值、执行构造块、最后执行目标对象的构造方法,完成对象的创建。
其中,init方法是Java文件编译之后在字节码文件中生成的,它是一个实例构造器,这个构造器会把语句块、变量初始化、调用父类构造器等操作组织在一起。所以调用init方法能够完成一系列的初始化动作。
面试点评
Java这个行业,你是初级开发、还是高级开发、是应该给你15k,还是给你30k,并没有行业标准。
所以,企业的筛选方式,只能从你的工作背景以及技术的深度去进行考察。
你说你CRUD写得很牛逼,市场上一抓一大把,但是同样是写CRUD,你凭什么薪资要比高5000?
你有本事回答出来啊,回答出来就给你这30k。是不是,
这个题目,显然也是考察JVM的底层原理,恰恰又是大家平时接触最多,但是研究最少的部分。没面上,只能说你没有本事。
即便是们把所有问题抛给所谓的内卷,但是市场的筛选机制,不会因为你一句话而改变。