JVM随笔记录1-jvm类加载器
记录一下对jvm类加载器的理解。
jvm在启动的时候,会通过类加载器对class文件加载进jvm中,一般加载经历的过程为 加载->验证->准备->解析->初始化->使用->卸载;
加载:在代码中有使用到某个类的时候,就会加载到这个类,比如在执行某个方法时有 new Demo();这时就会对Demo类进行加载
验证:在加载class文件时会对class文件中的内容做一个验证操作,校验文件中的字节码是否符合JVM规范;
准备:这个准备工作则是为Demo类分配一定的内存空间,如果Demo类中有定义静态的变量,比如static int i;同时会为i分配内存空间,并给定初始值0;
解析:把符号引用替换为直接引用的过程(此过程待补充,还不是很清楚)
初始化:在做完以上工作后,执行类初始化的代码,比如:
public class Demo{ public static int interval = Configuration.getInt("replica.interval"); }
这里在准备阶段给interval开辟一个内存空间赋值0,在初始话阶段则执行Configuration.getInt("replica.interval"),完成一个配置项的读取,下段代码中的static静态代码块也是在此阶段执行
public class Demo{ public static Map<String, String> map; static{ this.map = new HashMap<>(); } }
类的初始化还有一个重要的规则,就是如果在初始化一个类的时候,发现它的父类还没有初始化,那么必须先初始化它的父类;
上述就是一个一个类的加载过程,下面说下类加载器的概念,类加载器有以下几种类型:启动类加载器、扩展类加载器、应用程序类加载器、自定义加载器
(1)启动类加载器 (Bootstrap ClassLoader)
Bootstrap ClassLoader主要负责加载机器上安装的java目录下的核心类,比如安装jdk后下的lib目录下类库
(2)扩展类加载器(Extension ClassLoader)
Extension ClassLoader这个类加载器加载时会加载jdk目录下lib\ext目录中的类
(3)应用程序类加载器(Application ClassLoader)
Application ClassLoader这个负责去加载classPath环境变量所指定的路径中的类,大致可以理解为加载自己些的Java代码
(4)自定义类加载器
除了以上几种,还可以自己定义类加载器,根据自己的需求去加载自己定义的类
上述几个类加载器时存在亲子层级结构的,也就是 启动类加载器时最上层->扩展类加载器->应用程序类加载器->自定义类加载器,然后基于这个亲子结构,就有了一个双亲委派机制;
那么双亲委派机制时什么意思呢?
假设应用程序类加载器去加载一个自己些的java类,那么它会先委派给自己的父类加载器去加载,也就是扩展类加载器,然后扩展类加载器委派自己的父加载器(启动类加载器)加载,然后启动加载器在自己的加载目录中没有发现这个类,就通知扩展类加载器去加载,同样扩展类加载器也没有发现这个类,就通知应用程序类加载器去加载,这时应用程序类加载器在自己负责的范围下找到这个类,就会把这个类加载到内存中去了,这个就是所谓的双亲委派机制:先找父亲去加载,不行的话再由儿子来加载。

浙公网安备 33010602011771号