一、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类,然而这个利用类加载器不会真正去加载它,而是会调用看是否有父加载器,后果有,是扩大类加载器,扩大类加载器也不会间接去加载,它看本人是否有父加载器没,后果它还是有的,是根类加载器。