一、程序如何运行的
首先,我们都知道,java程序写好之后,打成jar包或者war,然后丢到服务器上启动运行,但是,到底是怎么运行的呢?java虚拟机在这里面怎么工作的?又是谁推动jvm的运转工作?
jvm底层是使用C++语言实现的,首先C++会帮我们创建jvm,然后把程序代码丢到jvm内存中,并且调用main方法,用以启动程序。
而jvm调用一些java类的方法时,是需要先进行类的加载的,只有被加载好的类才能被使用。
那么类加载,需要一个专门用来加载类的工具,我们称之为类加载器。
- 首先C++帮我们创建jvm
- C++创建一个引导类加载器,它是最顶层的类加载器
- 然后C++调用java的代码创建jvm的启动器Launcher的实例 Launcher有引导类加载器加载
- 创建Launcher实例过程中,会创建两个加载器:ExtClassLoad 和 AppClassLoad 加载器
- 然后使用AppClassLoad加载器按照双亲委派机制加载需要加载的类,之后调用main方法启动。
- java程序执行结束,jvm销毁。
二、类加载器
java类的加载是使用类加载器加载,那么类加载器有哪些?分别负责加载哪些类?如何工作的?
类加载器有哪些?分别负责加载哪些类?
- 引导类加载器(BootStrapClassLoader):负责加载支撑jvm运行的位于jre的lib目录下的rt.jar,charset.jar等核心类库中类
- 扩展类加载器(ExtClassLoader):负责加载支撑jvm运行的位于jre的lib目录下的ext扩展目下的核心类库中的类
- 应用类加载器(AppClassLoader):负责加载应用程序中自己创建类
- 自定义类加载器:负责加载自定义路径下的类
类加载过程分为:加载->验证->准备->解析->初始化
类加载器的创建
public class Launcher {
private static URLStreamHandlerFactory factory = new Launcher.Factory();
// 静态变量 该类在被加载的初始化阶段 被实例化 调用构造方法 单例模式
private static Launcher launcher = new Launcher();
private static String bootClassPath = System.getProperty("sun.boot.class.path");
private ClassLoader loader;
private static URLStreamHandler fileHandler;
//jvm调用此方法 获取实例
public static Launcher getLauncher() {
return launcher;
}
//构造方法
public Launcher() {
Launcher.ExtClassLoader var1;
try {
//创建ExClassLoader扩展类加载器
var1 = Launcher.ExtClassLoader.getExtClassLoader();