我遇到了以下情况:
我有一个单身人士:
public class BookManager {
private boplean initialized = false;
private static BookManager instance;
static {
instance = new BookManager();
}
public void init() {
//Performs some initialization code
initialized = true;
}
public List<Book> getAllBooks() {
if (!initialized) {
throw new Exception("Not initialized!");
}
//do some code to get the books list and return it
}
}
初始化单例并在应用程序初始化期间调用init方法,并且运行良好。
过了一段时间(不知道为什么) -
抛出异常的用例位于以下代码中:
BookManager.getInstance().getAllBooks();
我确信在应用程序启动时调用了“init”方法,
所以我怀疑BookManager类是卸载的。
当进行上述调用时,重新加载了类,但没有调用“init”方法。
有人可以解释GC在什么情况下收集类加载器?
(为什么班级开始卸载?)
答案 0 :(得分:0)
我找不到JBoss class loading documentation中卸载类的引用。但是,如果查看JLS的第12.7. Unloading of Classes and Interfaces章,只有在不再可以访问类加载器时才能卸载类。这意味着必须首先取消部署应用程序。这是由JVM处理的,因此JBoss在这里做不了多少。
说到这里,Java EE不支持将内容存储在静态变量中。
你得到的例外是什么? NullPointerException
?您可以做的是附加调试器并在BookManager.class
和#init
方法中检查#getAllBooks
的对象ID。如果它是相同的(我假设)没有发生卸载。