「JVM 类加载子系统」系列文章

剖析 [Bootstrap、Extension、Application] ClassLoader

本篇文章主要介绍三个主要类加载器的关系!!

我们需要知道的一个前提:Bootstrap ClassLoader 是 C++ 实现,而 Extension ClassLoader、Application ClassLoader 均为 Java 实现

133

如上图所示,左边是 C++ 实现,右边是 Java 实现。这里是跨语言调用,JNI 实现了由 C++ 向 Java 跨语言调用。C++ 调用的第一个 Java 类是 Launcher 类

从这个图中我们可以看出,C++ 调用 Java 代买创建 JVM 启动器,其中一个启动器是 Launcher,实际是调用sun.misc.Launcher类的getLauncher()方法创建

那我们就从这个方法入手看看到底是如何运行的?!

可以明显看出这就是一个单例模式!!launcher对象在类加载完成的时候就已经初始化好了,C++ 调用getLauncher()方法的时候会返回launcher对象

我们先来看看Launcher的构造方法,它主要就是初始化了两个类加载器:扩展类加载器、应用程序类加载器

在获取扩展类加载器的时候,调用getExtClassLoader()方法,具体见下面代码的流程:

在获取应用程序类加载器的时候,调用getAppClassLoader()方法,具体见下面代码的流程:

结论: