JAVA 类加载的过程

我们编写的代码是存储在.java文件中,java文件被编译后会转换为字节码,字节码可以在任何平台的java虚拟机中运行,这也是java能跨平台的原因。

类被加载到虚拟机中开始到被卸载出内存,整个生命周期包括7个部分:
加载-->验证-->准备--->解析-->初始化-->使用-->卸载
1)、加载:加载只是类加载过程中的一个过程而已。
a、JDK在执行程序运行命令时会去JRE目录中找到JVM.dll,并初始化JVM,这时会产生一个Bootstrap Loaderer(启动类加载器)
b、Bootstrap Loader自动加载 Extended Loader(标准扩展类加载器)
c、Bootstrap Loader 自动加载 APPClass Loader(系统类加载器)
d、最后由APPClass Loader加载我们指定的java类

双亲委派模型加载类的方式:

a、先检查此类是否被加载过,若没有加载则调用父类加载器的loadClass()方法
b、若父类加载为空,则默认使用启动类加载器作为父类加载器
c、若父类加载失败,会抛出一个异常,然后调用自己的findClass()方法进行加载
加载的理解:
首先启动-->启动类加载器,这时会调用启动类加载器的父类加载器,但由于启动类加载器是所有类的父加载器,所有他的父加载器为空,然后他就调用自己的findClass方法来启动加载。
标准加载器借用其父类(启动加载器)加载器启动加载
系统类加载器借用父类(标准类加载器)加载器启动加载
最后我们编写的类是有系统类加载器作为父类加载器加载启动
2)、验证:
验证的步骤:
文件格式的验证--->元数据的验证--->字节码的验证--->符号引用验证
a、文件格式的验证:主要检测字节码流是否符合Class文件格式规范,验证文件是否能被当前JVM所处理,如果没有问题,字节码可以进入方法区保存了
b、元数据验证:对字节码描述的信息进行语义分析,保证其描述的内容符合java语言的语法规范,能否被java虚拟机识别。
C、字节码验证:该部分最为复杂,对方法体内的内容进行验证,保证代码运行时不会做出危害虚拟机安全的事件。
D、符号引用验证:验证一些引用的真实性和可行性,比如代码里面引用了其他类,这里就是去检查一下是否存在;或者访问了其他类的一些属性,就对这些属性进行检查。
3)、准备:
准备阶段会为类变量分配内存并设置类的初始值;在准备阶段如int i=123的值为0,而不是123,因为此时只是分配到内存空间而已,并没有对i赋值,真正对i赋值是在初始化阶段
4)、解析:
类或接口的解析;字段的解析;类方法的解析;接口方法的解析;此部分内容涉及到invokedynamic指令,静态、动态语音调用;如果解析有问题,解析不通过会抛出异常。

5)、初始化:

初始化阶段是类加载最后阶段,这才是执行类定义的java程序代码(字节码)。在准备阶段,已经为变量赋过一次系统要求的初始值,到了初始化阶段会根据程序员要求初始化变量值。
java虚拟机没有严格约束什么时候开始类加载的第一阶段,但严格规定了只有5中情况必须立马对类进行初始化,当然加载、验证、准备、解析之后。
a、遇到new get static put static invoke static 这4条字节码指令,假如还没有初始化需要立马初始化。
b、使用java.lang.reflaect.*的方法对类进行反射、读取或者设置一个类的静态字段时,立马对其初始化。
c、初始化一个类的时候,如果父类没有被初始化,那么会先初始化父类
d、当JVM启动时候,用户需要制定一个执行的主类(包含:static void main),则JVM会先去初始化这个类
e、JDK1.7的动态语言的支持,如果java.lang.invoke.MethodHandle实例最后解析为get static put static invoke static 的方法句柄,并且这个方法句柄没有进行过初始化,则需要初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值