一、JVM 体系结构
.java 经由 javac 变为 class 字节码文件,再通过类加载器加载. 对于类加载器我依据南淮北安博主的文章进行了总结.
1. 类加载器
咱们都晓得 java 程序写好当前是以.java(文本文件)的文件存在磁盘上,而后,咱们通过(bin/javac.exe) 编译命令把.java 文件编译成.class 文件(字节码文件),并存在磁盘上。然而程序要运行,首先肯定要把.class 文件加载到 JVM 内存中能力应用的,咱们所讲的 classLoader, 就是负责把磁盘上的.class 文件加载到 JVM 内存中.
2.ClassLoader 层次结构
类加载器有三种:
(1)根类加载器(null)
它是由本地代码 (c/c++) 实现的,你基本拿不到他的援用,然而他理论存在,并且加载一些重要的类,它加载 (%JAVA_HOME%jrelib), 如 rt.jar(runtime)、i18n.jar 等,这些是 Java 的外围类。
(2)平台类加载器(PlatformClassLoader)(jdk1.8 之后的版本,之前的称为扩大类加载器 ExtClassLoader)
虽说能拿到,然而咱们在实践中很少用到它,它次要加载扩大目录下的 jar 包,%JAVA_HOME%libext
(3)利用类加载器(appClassLoader)
它次要加载咱们应用程序中的类,如 Test, 或者用到的第三方包, 如 jdbc 驱动包等。这里的父类加载器与类中继承概念要辨别,它们在 class 定义上是没有父子关系的。
3.Class 加载时调用类加载器的程序
当一个类要被加载时,有一个启动类加载器和理论类加载器的概念,这个概念请看如下剖析:
如下面的 Test.class 要进行加载时,它将会启动利用类加载器进行加载 Test 类,然而这个利用类加载器不会真正去加载它,而是会调用看是否有父加载器,后果有,是扩大类加载器,扩大类加载器也不会间接去加载,它看本人是否有父加载器没,后果它还是有的,是根类加载器。