Tomcat:Tomcat如何在内部卸载类?

时间:2016-10-18 15:29:18

标签: java spring tomcat osgi classloader

我正在寻找一种方法,用新的功能替换旧功能的jar而不停止整个应用程序。我已经谷歌搜索了一下(Unloading classes in java?Dynamically loadable and unloadable application modules in Java - how?),并找到了3种可能的解决方案:

  1. OSGI,对我来说看起来太复杂了:从这个强大的规范中我唯一需要卸载类。
  2. 自己的实现,这意味着创建自己的类加载器,在其帮助下加载jar,并在时间到来解雇jar时 - 将Classloader实例暴露给GC并希望GC将它与所有加载的jar一起删除,这可能不会立即发生
  3. 复制东西应用程序服务器做:)这是我的问题的目的。
  4. 有没有关于Tomcat如何卸载类(战争)的解释?是否可以在我的应用程序中重复使用它?

    PS 就在我写这篇文章的时候,有两个奇怪的想法出现在我脑海里:

    1. 可能是我们可以使用新的jar集启动另一个应用程序实例,并将输入和输出数据流从旧的切换到新的。如果有一个地方可以保存状态 - 它可以比完全重启更快。
    2. 可能春天可能有帮助吗?它可以动态地注册bean,但这看起来有点丑陋的解决方案,无论如何都无法卸载它们;可能是,Spring Boot可能有帮助吗?

3 个答案:

答案 0 :(得分:2)

只有当类及其类加载器无法访问并且因此有资格进行垃圾回收时,才能卸载该类。由于类加载器可以到达它加载的每个类,并且由类加载器加载的每个类都可以到达它的类加载器,并且作为类的实例的每个对象都可以到达它的类,这意味着类加载器,它加载的所有类并且作为这些类的实例的所有对象必须 all 无法访问并且有资格被垃圾收集。只有这样,一个班级才能被卸下"当完整的对象图被垃圾收集时。

答案 1 :(得分:1)

我只能部分地回答你的问题,但总比没有好......你是对的,模块化是一个非常繁琐的话题(至少在Java 9之前)。

Ad idea 2(Spring):我已经对Spring Boot over here做了一些考虑,并得出结论,我将坚持OSGI(值得进入它)或纯粹的微服务架构。

答案 2 :(得分:1)