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类,那么它会先委派给自己的父类加载器去加载,也就是扩展类加载器,然后扩展类加载器委派自己的父加载器(启动类加载器)加载,然后启动加载器在自己的加载目录中没有发现这个类,就通知扩展类加载器去加载,同样扩展类加载器也没有发现这个类,就通知应用程序类加载器去加载,这时应用程序类加载器在自己负责的范围下找到这个类,就会把这个类加载到内存中去了,这个就是所谓的双亲委派机制:先找父亲去加载,不行的话再由儿子来加载。

 

 

  

posted @ 2020-09-24 09:58  码一段代码  阅读(113)  评论(0)    收藏  举报