claasloader读书笔记

claasloader

1classloaderclass加载到jvm中。

2、父优先的等级加载,双亲委派模型。

 

3defineclass用于将字节流解析成Class对象,主要用于读取class文件,以及网络文件中的类等。defineclass不会解析类,只会在此对象实例化时才会resolve

defineclassfindclass常一起使用,findclassclassloader中的方法,覆盖后可以自定义加载规则。

4this.getclass.getclassloader.loadclass可以在运行时加载指定类到程序。(只能在本程序的类加载器中加载).加载后还没解析,实例化时才resolve

5classforname()可以加载类并解析。

例子:;

Class.forName("org.java.lang",true,getClass().getClassLoader());参数为 类名、是否初始化、所用类加载器

getsystemclass也可以在自定义类加载器中加载类

 

6

Classloader是抽象类


  1. Bootstrap ClassLoader/启动类加载器 

    主要负责jdk_home/lib目录下的核心api-Xbootclasspath选项指定的jar包装入工作。

  2. Extension ClassLoader/扩展类加载器 

    主要负责jdk_home/lib/ext目录下的jar包或-Djava.ext.dirs指定目录下的jar包装入工作。

  3. System ClassLoader/系统类加载器 

    主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。

  4. User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类

    在程序运行期间,通过java.lang.ClassLoader的子类动态加载class文件,体现java动态实时类装入特性。

     

    自定义的类加载器都继承自URLclassloader或其他子类。

    但这些类的父加载器都是appclassloader

    因为它们都调用getsystemclassloader作为父加载器,getsystemclassloader的返回值都是appclassloader

     

    7、加载一个类的过程

     

     

     

     

     

     

     

    8jvm表示一个类是否是同一个类有两个条件:

    1、完整类名是否一样

    2、加载该类的classloader是否是同一个类加载器的同一个实例

    (不仅要类相同,实例也要是同一个)。

     

    9、回收问题:classloader加载的类的字节码(就是。class)会被保存在jvm的永久代,它的对象无引用时也会被jvm回收,但如果大量动态加载类时,会造成永久带溢出。(因为永久代只在full gc时清理,若full gc不频繁,会造成永久代内存溢出)

     

    systemgc会触发垃圾回收,但不知道回收情况如何。

    一般情况下systemgc会触发full gc,会stop the worldfull gc一般回收老年代和永久代。