jvm类加载机制

加载机制

  • JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化。
  • 在这里插入图片描述

加载

  • 通过一个类的全限定名获取该类的二进制流。
  • 将该二进制流中的静态存储结构转化为方法去运行时数据结构。
  • 在内存中生成该类的 Class 对象,作为该类的数据访问入口。

验证

  • 主要目的是确保class文件中的字节流的信息不回危害到虚拟机
    • 文件格式验证:验证字节流是否符合 Class 文件的规范,如 主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.
    • 元数据验证:对字节码描述的信息进行语义分析,如这个类是 否有父类,是否集成了不被继承的类等。
    • 字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。
    • 符号引用验证:这个动作在后面的解析过程中发生,主要是 为了确保解析动作能正确执行。

准备

  • 准备阶段为类的静态变量分配内存(在方法区内存中,此处只考虑方法区存在的情况,注:jdk1.7将方法区一部分移到了堆中,jdk1.8元数据区替代了原来的永久代),并将其初始化为默认值,而不是代码中赋予的初始值,初始值的赋予则是在java类初始化阶段完成。
  • 对于引用的静态类型,一般被赋予null
  • 如果被final修饰,准备阶段就会被赋予代码中的初始值,此时已经将变量值放入了常量池中。

解析

  • 把类中的符号引用转化为直接引用,虚拟机将常量池内的符号引用替换为直接引用的过程。

初始化

  • 为类的静态变量赋予正确的初始值(准备阶段已经赋值(默认值)),JVM负责对类进行初始化,主要对类变量进行初始化。
  • 具体步骤
    • 假如这个类还没有被加载和连接,则程序先加载并连接该类

    • 假如该类的直接父类还没有被初始化,则先初始化其直接父类

    • 假如类中有初始化语句,则系统依次执行这些初始化语句

类加载器

原理:

  1. 当运行指定程序时,JVM 会将编译生成 的 .class 文件按照需求和一定的规则加载到内存中,并组织成为 一个完整的 Java 应用程序。
  2. 这个加载过程是由类加载器完成,具 体来说,就是由 ClassLoader 和它的子类来实现的。
  3. 类加载器本 身也是一个类,其实质是把类文件从硬盘读取到内存中。
    类的加载方式:
  4. 隐式加载指的是程序在使 用 new 等方式创建对象时,会隐式地调用类的加载器把对应的类 加载到 JVM 中。
  5. 显示加载指的是通过直接调用 class.forName() 方法来把所需的类加载到 JVM 中。
    在这里插入图片描述

启动类加载器:Bootstrap ClassLoader

  • 主要负责加载存放在\jre\lib目录下,或被-Xbootclasspath参数指定的路径中的(sun.boot.class.path),通常指的是rt.jar里的类。
  • 启动类加载器比较特殊,HotSpot虚拟机中它利用C++ 实现,作为虚拟机自身的一部分,它的实现设计JVM底层的实现细节,所以开发者无法直接获取它的引用,所以从他的子类获取它返回的为null

扩展类加载器:Extension ClassLoader

  • 负责加载 JAVA_HOME\lib\ext 目录中的,或通过java.ext.dirs系统变量指定路径中的类库。

应用程序类加载器:Application ClassLoader

  • 该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,作为应用程序中类默认的类加载器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值