其他分享
首页 > 其他分享> > JVM启动及类加载

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属性指向“引导类加载器”

标签:java,及类,Launcher,HelloWorld,实例,JVM,加载
来源: https://www.cnblogs.com/gabechen/p/14974033.html