JVM(Java Virtual Machine)主要任务就是负责将字节码装载到其内部,解释/编译为对应平台上的机器指令执行。
主要包含四大部分:类加载器、运行时数据区、本地方法接口、执行引擎。
程序在执行之前将Java代码转换为字节码(class文件),JVM通过类加载器将文件加载至运行时数据区,通过执行引擎将字节码翻译成底层系统指令再交由CPU执行,此过程需要调用本地库接口来实现程序功能。

通过类名(地址)获取此类的二进制字节流,在内存中生成一个代表这个类的java.lang.Class对象。
类的初始化顺序
这个类加载器使用C/C++语言实现嵌套在JVM内部,它只加载存放在
由java语言编写的,由sun.misc.Launcher$ExtClassLoader实现,从 JDK 系统安装目录的 jre/lib/ext 子目录(扩展目录)下加载类库,上层类加载器为引导类加载器。
由java语言编写,由sun.misc.Launcher$AppClassLoader实现;加载我们自己定义的类(class文件夹中),上层类加载器为扩展类加载器。
tomcat中有加载器。
注:加载核心类时,通过是启动类加载器;自己创建类,通过应用程序类加载器。

如果一个类加载器收到类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行。
如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器。
如果父类加载器可以完成类的加载任务,就成功返回,倘若父类加载器无法完成加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制。
如果均加载失败,就会抛出ClassNotFoundException异常。
优点
主动使用:需要初始化类
被动使用:不用初始化类
引用该类的静态常量,且已经指定字面量的常量
构造某个类的数组时不会导致该类的初始化
注:主动使用和被动使用的区别在于类是否会被初始化