虚拟机类加载机制

代码编译的结果从本地机器码转变为字节码, 是格式存储的发展的一小步, 却是编程语言发展的一大步  ----  深入理解JVM

 


什么是虚拟机的类加载机制?

    虚拟机把编译后的 class 字节码加载到内存, 并对其进行效验,解析 和 初始化后, 最终形成可以被虚拟机直接使用的 java 类型. 这个过程便是 类 加载机制.    

    简单来说, 就是把 class 字节码文件, 转换成我们在 java 程序中使用的一个个 class 对象.


Java 的类型的加载, 连接, 和初始化的过程都是在程序运行期间才开始的, 这虽然会有一定的效率影响, 但这给编程带了极大的灵活性, 比如我们在程序运行期间, 可以从网络上下载二进制字节码文件, 然后将其加载, 变成代码的一部分, 大致觉得 热修复 和这个联系很大.

在 java 中, 只有 类 和 接口 编译后才会产生 class 文件.


Class 对象的完整生命周期:

  1. 加载
  2. 验证
  3. 准备
  4. 解析
  5. 初始化
  6. 使用
  7. 卸载

这七个过程在 类 的加载过程中会 按部就班 的开始, 注意是开始, 不是按部就班的完成, 这几个过程很有可能会同时运行.

虚拟机没有明确规定一个类何时应该被加载, 但是明确规定了, 有且只有 下面种情况必须马上对类进行初始化, 当然, 之前的过程自然需要在此之前开始:

  1. new 关键字, 使用了一个类的静态字段(编译器常量不算, 如 被 static final 修饰的基本数据类型和 string), 使用了静态方法,  这里需要注意的是, 静态字段只会加载这个字段和方法所在的类, 比如通过子类引用父类的静态字段, 子类不会得到加载.
  2. 对一个类使用反射时.
  3. 当初始化一个类时, 如果父类没有初始化, 那么要先初始化父类 (接口不需要, 这也是接口和类的加载过程唯一有区别的地方)
  4. 当虚拟机启动时, 用户指定的那个要执行的主类, 即有 main 方法的那个.
  5. Java 7 的动态语言支持时 (这个有点迷)

注意:

    当我们使用一个 类 来定义一个数组时, 这个类不会得到加载, 虚拟机会自动的为这个类生成一个 同名加上  ' [ ' 前缀的类来表示这个数组类, 数组中的属性和方法都实现在这个类里面.   这也就表明了 jvm 中, 数组对象是用一个 类 来表示的, 终于可以理解为什么基本类型的数组是引用类型了.


需要注意的地方, 虚拟机中是采用 class 文件和 加载这个 class 文件的类加载器来决定一个类在 一个 虚拟机中的唯一性的.

举个例子, 比如我们使用自定义 类 加载器加载了 类 A , 然后生成了一个实例对象, 当我们使用 instanceof 去和 由系统加载的 类A 的class 对象进行比较时, 会得到 false, 即使采用 class.getName 会得到一模一样的名字, 这一点需要注意.


 

虚拟机的类加载模型:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值