JVM启动及类加载

原料

  1. Win10操作系统,安装好JDK,配置好环境变量: JAVA_HOME, Path, CLASSPATH
  2. 在D:\test下,写一个HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
  1. javac编译HelloWorld.java得到HelloWorld.class
  2. 使用命令:java HelloWorld 运行该类,得到输出结果:Hello World!

java HelloWorld 命令执行过程分析

  1. 这个命令里的java就是位于JAVA_HOME/bin下的java.exe可执行程序
  2. 这个命令里的HelloWorld是给java.exe传递的参数,代表的是HelloWorld.class文件
  3. 当执行该命令时,Win10操作系统调用java.exe可执行程序,并给它传递参数HelloWorld
  4. java.exe会启动一个JVM(C++编写的)
  5. JVM里面会启动一个ClassLoader实例(C++编写的),这个ClassLoader叫做引导类加载器
  6. 引导类加载器实例会加载一个由Java编写的类sun.misc.Launcher的实例
  7. Launcher实例会加载另外两个类加载器(由Java实现):ExtClassLoader,AppClassLoader
  8. AppClassLoader会加载标题中的给java命令传递进来的参数HelloWorld所代表的类
  9. 它会读取HelloWorld.class文件,根据里面信息,生成这个类的Class对象
  10. JVM执行这个Class里面的main方法。
  11. 销毁JVM。

三个类加载器之间的关系

  1. 引导类加载器由C++实现,由JVM生成其实例,只负责加载一个类sun.misc.Launcher的实例
  2. ExtClassLoader,AppClassLoader由Java实现,都间接继承自java.security.ClassLoader,由sun.misc.Launcher实例负责生成他们的实例,他们也是写在sun.misc.Launcher类里面的两个静态类
  3. ExtClassLoader负责加载JDK里面的类
  4. AppClassLoader负责加载我们自己写的类
  5. 三个类加载器的关系是父子关系,AppClassLoader里面的parent属性指向ExtClassLoader,ExtClassLoader里面的parent属性指向“引导类加载器”
上一篇:什么是BFC?BFC是什么?为什么会有BFC


下一篇:3分钟学会BFC