在Java中,当我在像appfish这样的appserver中运行应用程序时,我的应用程序部署为EJB。当我取消部署EJB时,对于加载到内存中的sigletone类会发生什么。我理解,直到我重新启动容器它们存在于那里并且可以被垃圾收集但是我不确定它将在何时何地发生,所以如果我再次部署ejb它可能从jvm中拾取旧对象, ?
答案 0 :(得分:2)
每个部署的应用程序都加载了自己独立的类加载器。由于类加载器是类的标识的一部分,因此可以多次加载相同的类(具有不同的配置),而不会使不同的实例相互干扰。
这有效地将app服务器中的不同应用程序彼此隔离,甚至允许同一应用程序并行运行两次。
当取消部署应用程序时,如果没有对它们的引用,则将对其所有对象(包括类加载器以及类本身)进行垃圾回收。不幸的是,可能会发生引用仍然存在于某个系统类中并阻止垃圾收集 - 这称为classloader leak。
答案 1 :(得分:0)
垃圾收集在任意时间运行,您无法控制它。虽然Java的垃圾收集器可以重用旧对象,但我想情况并非如此。取消部署时,单例会被销毁。部署时,它会创建一个新的。