类加载机制[1]
Java 默认提供的三个 ClassLoader
BootStrap ClassLoader
称为启动类加载器,是 Java 类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar, resources.jar, charsets.jar 等
Extension ClassLoader
称为扩展类加载器,负责加载Java的扩展类库,默认加载 JAVA_HOME/jre/lib/ext 目录下的所有 jar
App ClassLoader
称为系统类加载器,负责加载应用程序 classpath 目录下的所有 jar 和 class 文件
如果你需要从其他路径,比如网络上加载类的时候就需要实现自己的类加载器。类加载器的作用就是告诉虚拟机去哪里加载所需要的类。用了委派的设计模式。即便用自定义类去加载所类。它是向自己的上一级询问这个类有没有加载,逐级向上。如果都没有加载。再由上到下尝试去加载。如下图:
classLoader
内存泄漏[2]
每个对象,都有一个对它的类的引用,object.getClass()
每个类对象,都有一个对它的 classLoader 的引用,object.getClass().getClassLoader()
同样的每个 classLoader 对它加载的类对象都有一个引用。如果某个对象发生了内存泄漏,则它的类对象也不能被回收,加载类对象的 classLoader 也就不能被回收,根据垃圾回收的规则,该 classLoader 加载的类对象都不能被回收。