前言
在我们运行java程序时,java底层进行了一系列的操作,大体有五个操作步骤,分别按照先后顺序为:加载——>验证——>准备——>解析——>初始化,下面分别来解释这五个步骤具体干了什么。
加载
jvm将我们写好的类从磁盘加载到内存中。(在我们编写java代码的时候,我们保存是将代码保存到我们的硬盘上,而在我们执行java程序的时候,就会将我们硬盘上的代码拷贝到内存中来进行操作,因为内存中操作速度更快)
验证
jvm验证字节码文件的正确性,如果我们写的代码语法有错误,在这一步就会检测出来。(jvm对代码进行分析验证,如果我们没有按照java语法来开发,例如我们程序没有以class开头,或者我们赋值类型不匹配,jvm都会分析验证出来)
准备
给类的静态变量分配内存,并赋予默认值。(jvm会先将我们定义为静态变量的类型分配内存,并将默认值赋予)
解析
将符号引用替换为直接引用。(首先来讲一下符号引用和直接引用是什么)
符号引用:假如我们main主类中new了一个student类,但是我们在加载的时候并不会去找我们student类在磁盘中的具体地址,而是以一个例如:com.xiaoqi.cn.Student;这样一个包位置来代表我们对student类的引用。
直接引用:当我们main主类中new了一个student类,我们会将student类在磁盘的位置找到,位置例如:0X06HXXXXX,这样我们就可以直接通过磁盘位置找到student类。
初始化
对类的静态变量初始化为指定的值。(在准备阶段我们对类的静态变量分配了内存空间,并赋予了默认值,而在初始化阶段我们将用我们静态变量定义的真实值把默认值替换,如果我们静态变量没有定义初始值,那他就会是默认值,这就是我们为什么new一个变量的时候他会给我们一个默认值,而不是空值)