JVM启动及类加载
作者:互联网
原料
- Win10操作系统,安装好JDK,配置好环境变量: JAVA_HOME, Path, CLASSPATH
- 在D:\test下,写一个HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
- javac编译HelloWorld.java得到HelloWorld.class
- 使用命令:java HelloWorld 运行该类,得到输出结果:Hello World!
java HelloWorld 命令执行过程分析
- 这个命令里的java就是位于JAVA_HOME/bin下的java.exe可执行程序
- 这个命令里的HelloWorld是给java.exe传递的参数,代表的是HelloWorld.class文件
- 当执行该命令时,Win10操作系统调用java.exe可执行程序,并给它传递参数HelloWorld
- java.exe会启动一个JVM(C++编写的)
- JVM里面会启动一个ClassLoader实例(C++编写的),这个ClassLoader叫做引导类加载器
- 引导类加载器实例会加载一个由Java编写的类sun.misc.Launcher的实例
- Launcher实例会加载另外两个类加载器(由Java实现):ExtClassLoader,AppClassLoader
- AppClassLoader会加载标题中的给java命令传递进来的参数HelloWorld所代表的类
- 它会读取HelloWorld.class文件,根据里面信息,生成这个类的Class对象
- JVM执行这个Class里面的main方法。
- 销毁JVM。
三个类加载器之间的关系
- 引导类加载器由C++实现,由JVM生成其实例,只负责加载一个类sun.misc.Launcher的实例
- ExtClassLoader,AppClassLoader由Java实现,都间接继承自java.security.ClassLoader,由sun.misc.Launcher实例负责生成他们的实例,他们也是写在sun.misc.Launcher类里面的两个静态类
- ExtClassLoader负责加载JDK里面的类
- AppClassLoader负责加载我们自己写的类
- 三个类加载器的关系是父子关系,AppClassLoader里面的parent属性指向ExtClassLoader,ExtClassLoader里面的parent属性指向“引导类加载器”
标签:java,及类,Launcher,HelloWorld,实例,JVM,加载 来源: https://www.cnblogs.com/gabechen/p/14974033.html