【发布时间】:2023-03-26 05:05:02
【问题描述】:
我正在使用 WildFly 11 Final,并创建了以下 EJB:
@Singleton
@Startup
public class MyDebug {
private static final MyStaticSingleton myStaticSingleton = new MyStaticSingleton();
}
现在,如果我重新部署应用程序并通过 JVisualVm 查看堆,我将在每次重新部署时再看到一个 MyStaticSingleton 实例。 MyStaticSingleton 的实例由不同的 ClassLoader 引用。
在卸载应用程序后,JavaEE 应用程序的类加载器没有被丢弃是正常行为吗?
【问题讨论】:
-
我很好奇你为什么要在@Singleton 中放置一个静态属性。由于您的封闭实例是作为单例管理的,因此您“应该”能够将其标记为私有(如果您确实需要,则为最终实例)。您的静态引用可能导致封闭的“先前”实例没有被垃圾收集(即使 ejb 容器不再管理它)。
-
为了方便调试,我把@Singleton注解放在那里。这样,我可以确保在部署时立即加载类,以便在连续几次重新部署后立即检查堆。
标签: jakarta-ee ejb wildfly classloader