JVM灵魂拷问系列之整点类加载机制吧


JVM灵魂拷问系列之问点类加载机制吧

1. 你知道java文件是如何被运行的吗?

  1. Java文件经过编译后变成 .class字节码文件
  2. 字节码文件通过 类加载器 被搬运加载到 JVM 虚拟机中

2. 那你说说类加载器的流程吧,从类被加载到释放内存

总共有七个步骤:加载,验证,准备,解析,初始化,使用,卸载。其中 验证,准备,解析三个部分统称为连接

  1. 加载:将class文件加载进内存中
  2. 连接:(1)验证,做一个安全检查,保证字节码符合JVM相关规则与规范;(2)准备:设置静态变量初始值等(3)解析:将常量池的引用替换为真实地址引用
  3. 初始化:赋值的过程
  4. 卸载:GC释放无用对象的内存

3. 类加载器是怎么加载一个class的(双亲委派机制)?

双亲委派加载机制

当一个ClassLoader实例需要加载某个类时,它会试图亲自搜索某个类之前,先把这个任务委托给它的父类加载器,这个过程是由上至下依次检查的。

  1. 首先由最顶层的类加载器 Bootstrap ClassLoader 试图加载
  2. 如果没加载到,则把任务转交给 Extension ClassLoader 试图加载
  3. 如果也没加载到,则转交给 App ClassLoader 进行加载
  4. 如果它也没有加载得到的话,则返回给 委托的发起者,由它到指定的文件系统或网络等URL中加载该类。
  5. 如果它们都没有加载到这个类时,则抛出 ClassNotFoundException 异常。

那为什么要这么做呢?

比如加载位于rt.jar包中的类时不管是哪个加载器加载,最终都会委托到 BootStrap ClassLoader 进行加载,这样保证了使用不同的类加载器得到的都是同一个结果。

例子🌰:如果我们自己写了String类,其实是会报错的,因为在加载的过程中,会先找到 rt.jar 中的String.class。

【参考链接】
1:Jar 包依赖冲突排查思路和解决方法
2:大白话带你认识JVM


评论
  目录