java的热部署/热更新(2)类加载机制

类加载机制

类加载机制最困难的就是类的状态性。更直白的说,就是类的static的字段。

常见的类加载方案

tomcat

我们看tomcat,是一个简单的顶层类优先方案。
java的热部署/热更新(2)类加载机制_第1张图片
这个类加载方案看起来很完美。但是不可避免的有一个问题,就是部分底层类是共用的。在tomcat的环境下,就是一些java基础类库。会在不同的webapp下共用。这当然不是什么问题。java基础类库遵循无状态的设计原则。webAppA不会因为对某个底层class的状态改动而导致webAppB得到和其单独运行时不同的结果。

但是当我们设计我们热部署的时候,往往不满足这个假设。特别是在这个错误的单例模式泛滥的年代。大量字段被设计成了static字段。比如一个DataSource类里面用static字段维持着对若干个mysql的链接,按照mysql的某种alias进行查找。如果两个热部署实体拥有相同的alias的不同mysql链接,就会造成相互影响。诚然,我们可以要求这个DataSource类的作者修改代码,但是在实际工作中,我们往往没有规范和审查他人写代码的权力和时间。

osgi

java的热部署/热更新(2)类加载机制_第2张图片
简述这个逻辑,仍然是一个基础类由框架加载器加载,其他类遵循先找其他bundle,再找本bundle的逻辑。和tomcat区别不大。当然也解决不了我们上面的问题。

一个实用的类加载机制

java的热部署/热更新(2)类加载机制_第3张图片

你可能感兴趣的:(java,开发语言)