JAVA中new()指令都进行了那些操作

java代码(.java)文件如何通过java虚拟机(jvm)运行起来呢?

首先将.java文件通过编译生成java虚拟机可以识别的.class文件,然后java虚拟机将.class文件翻译成机器可识别的机器码,这样一份java代码在机器上就可以运行起来了如下图所示:

JAVA中new()指令都进行了那些操作_第1张图片

使用new()创建对象后台都进行了什么操作?

那我们在代码中创建对象的时候常用的指令为new(类),这样子就会在java堆中生成此类的一个对象实例;那内存中到底执行了哪些操作呢?

大致过程分为下面3步:

1.查看方法区中是否已经有需要实例化的类,如果没有则此类还没有进行类加载,则先执行类加载

2.加载成功之后获取到实例化的类java.lang.Class(镜像)

3.通过该镜像在堆内存中分配空间,创建对象

类加载过程

类加载简单的说就是 类加载器负责读取编译后的.class文件,并转换成java.lang.Class类的一个实例,用来封装类在方法区内的数据结构。

1.类加载的生命周期

类加载的生命周期是从类被加载到内存开始,直到卸载出内存为止的。整个生命周期分为7个阶段:加载、验证、准备、解析、初始化、使用、卸载。其中,验证、准备、解析三部分统称为连接。具体步骤如下图所示:

JAVA中new()指令都进行了那些操作_第2张图片

类加载的生命周期简单介绍如下所示:

(1) 加载:查找需要的.class文件;

(2) 链接:把.class文件的二进制数据合并到JRE中;

    (a)校验:检查载入.class文件文件数据的正确性;

    (b)准备:给类的静态变量分配存储空间与初始值;

    (c)解析:将符号引用转成直接引用;

(3) 初始化:对类的静态变量,静态代码块执行初始化操作也就是说给静态变量赋予真正的值;
参考某位大神的一篇博客:https://blog.csdn.net/w760079528/article/details/77845267

创建对象

编译好的.class文件经过类加载器加载之后会将类信息保存在方法区中;并且同时在堆中生成一个java.lang.Class实例用来表示方法区中类的镜像,这个Class镜像与方法区中对应的类是一对一服务,因为他有类的结构信息,所以他自然可以构造出一个类的对象。通过此镜像的 newInstance()方法就可以创建出该类的一个对象。详细过程分为如下几步:

1.分配内存:为新生的对象在堆中分配存储空间,大小在类加载完之后完全确定的

2.初始化:内存分配完成之后,将内存空间的值都初始化为零值,这一操作保证了对象的实例字段在Java代码中可以不赋初始值就可以直接使用

3.设置:接下来虚拟机要对对象进行必要的设置,例如对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、GC的对象分代年龄等信息。这新信息储存在对象头中(Object Header)之中

4.根据构造方法初始化赋值:在上面的工作都完成后,从虚拟机的角度来看,一个新的对象已经产生,但从Java的角度来看,对象的创建才刚刚开始——方法还没有执行,所有的字段还都为零。因此在执行完new指令之后会接着执行方法,把对象按照构造方法进行初始化,这样一个真正开用的对象才算创建完成。

类加载与创建对象是同时的?

不一定,当类还没有加载的时候;访问这个类的静态变量就只加载而不会创建对象,当通过new指令的时候就加载的时候同时创建对象

 

 


 

 

你可能感兴趣的:(JAVA中new()指令都进行了那些操作)