java小生@JVM类加载机制( 二 )


负责加载 JAVA_HOME\lib 目录中的 , 或通过-Xbootclasspath参数指定路径中的 , 且被 虚拟机认可(按文件名识别 , 如rt.jar)的类 。
2.2 扩展类加载器(Extension ClassLoader)
负责加载 JAVA_HOME\lib\ext 目录中的 , 或通过java.ext.dirs系统变量指定路径中的类 库 。
2.3 应用程序类加载器(Application ClassLoader)
负责加载用户路径(classpath)上的类库 。
JVM通过双亲委派模型进行类的加载 , 当然我们也可以通过继承java.lang.ClassLoader 实现自定义的类加载器 。
java小生@JVM类加载机制
本文插图
2.4 双亲委派
当一个类收到了类加载请求 , 他首先不会尝试自己去加载这个类 , 而是把这个请求委派给父 类去完成 , 每一个层次类加载器都是如此 , 因此所有的加载请求都应该传送到启动类加载其中 ,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的 Class) , 子类加载器才会尝试自己去加载 。
采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object , 不管是哪个加载 器加载这个类 , 最终都是委托给顶层的启动类加载器进行加载 , 这样就保证了使用不同的类加载 器最终得到的都是同样一个Object对象 。
java小生@JVM类加载机制
本文插图
2.5 OSGI(动态模型系统)
OSGi(Open Service Gateway Initiative) , 是面向Java的动态模型系统 , 是Java动态化模块化系 统的一系列规范 。
2.5.1 动态改变构造
OSGi 服务平台提供在多种网络设备上无需重启的动态改变构造的功能 。 为了最小化耦合度和促使 这些耦合度可管理 , OSGi技术提供一种面向服务的架构 , 它能使这些组件动态地发现对方 。
2.5.2 模块化编程与热插拔
OSGi旨在为实现Java程序的模块化编程提供基础条件 , 基于OSGi的程序很可能可以实现模块级 的热插拔功能 , 当程序升级更新时 , 可以只停用、重新安装然后启动程序的其中一部分 , 这对企 业级程序开发来说是非常具有诱惑力的特性 。
OSGi 描绘了一个很美好的模块化开发目标 , 而且定义了实现这个目标的所需要服务与架构 , 同时 也有成熟的框架进行实现支持 。 但并非所有的应用都适合采用 OSGi 作为基础架构 , 它在提供强大 功能同时 , 也引入了额外的复杂度 , 因为它不遵守了类加载的双亲委托模型 。