JVM系列3:类加载机制

  了解类加载机制也是深入了解Java的重要一环,它包括加载过程、类加载器、加载机制等内容。

  以下是我总结的思维导图。

类加载

  首先讲讲类加载的时机,以下是会触发类加载的时机:

  1、new、get/put/invoke+static  new 一个类,或访问它的静态方法或常量时。

  2、reflect包的方法

  3、初始化一个类,其父类需初始化

  4、main函数类

  5、MethodHandle实例最后的解析结果REF_get/put/invoke方法

  

  类加载器及类加载机制  

  Java中有3种类加载器,1、Bootstrap ClassLoader启动类加载器,它负责加载Java一些根基类,加载JAVA根目录/lib.

              2、Extension ClassLoader扩展类加载器,加载Java根目录/lib/ext里的类。

             3、Application ClassLoader应用程序类加载器,加载用户类路径下的包。

  Java类加载机制是采用双亲委派加载机制或者说多层级父类加载机制。如下:

  每个加载器接受到加载请求都会传递给上级,直到上级无法处理才会传回给自己加载。这么做的目的是保证基础类一致性,保证类基础性行为。

  比如当我们判断两个对象是否相同,它的前提就是它们由同一个类加载器加载,否则这些比较毫无意义了。

  双亲委派机制并不是强制的,实际上也出现了破坏双亲委派的加载机制如JNDI(父级请求子级)、热部署热替换(网状结构)。具体内容以后研究。

  类加载过程

  Java类加载过程分为七步:

  1、加载  a、通过类的全限定名获取此类二进制字节流(类加载器加载)

      b、将字节流代表的静态存储结构转化为方法区运行时数据结构

      c、在内存中生成一个代表该类的对象,作为方法区该类的数据访问入口

  2、验证 验证类的数据格式、安全性等。

  3、准备 正式为类变量分配内存并设置类变量初始值(在方法区),初始值是各static修饰类变量的0值,如int初始为0,boolean初始为false,如果是static final修饰的直接赋予给定值。

  4、解析 将常量池内的符号引用替换为直接引用(实际内存地址)的过程

  5、初始化  执行类构造器<clinit>()方法的过程,就是收集并执行所有类变量赋值动作和静态语句块。(new对象时,类初始化完,还会执行成员变量赋值及实例语句块以及构造方法<intit>)

  6、使用 对象使用

  7、回收 对象回收

    

猜你喜欢

转载自www.cnblogs.com/llsblog/p/10628298.html