Java虚拟机类加载机制

类加载的整个生命周期:加载、验证、准备、解析、初始化、使用、卸载。其中验证、准备、解析3个部分统称为连接。

初始化情况

  • 遇到new、getstatic、putstatic、invokestatic这4条字节码指令。
  • 使用java.lang.reflect包的方法对类进行反射调用。
  • 初始化的一个类的时候,发现其父类没有进行初始化。
  • 初始化化主类(包含main()方法的那个类)
    这几种情况称为主动引用。除此之外,所有引用的类都不会触发初始化,称为被动引用。

加载

  • 通过全名获取此类二进制字节流。
  • 将二进制流所代表的静态结构转化为方法区的运行时刻数据结构。
  • 在内存中生存一个代表这个类的对象,作为方法去这个类的各种数据的访问入口。

类加载器

  • 启动类加载器(Bootstrap ClassLoader):负责加载JAVA_HOME/lib目录的类库。
  • 扩展类加载器(Extension ClassLoader):负责加载JAVA_HOME/lib/ext目录的类库。
  • 应用程序类加载器(Application ClassLoader):负责加载用户路径ClassPath上指定的类库。
  • 自定义类加载器(User ClassLoader)

在虚拟机中,类加载器和类名确定了一个类的唯一性。对应虚拟机来说,只存在两种类加载器:一种是启动类加载器,由C++实现,是虚拟机自身一部分,开发人员不能继承实现;另外一种就是所有其他类加载器,这些类加载器都有Java语言实现,独立虚拟机外部,并且全部由抽象类java.lang.ClassLoader。

双亲委派模型

如果一个类加载器收到加载类的请求,它自己不会去加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层启动类加载器中,只有父类加载器反馈自己无法完成这个加载请求时,子类加载器才会尝试自己去加载。如下图所示:

你可能感兴趣的:(java,jvm,虚拟机)