0


我遇到了以下情况:
我有一个单身人士:

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 正在收集类加载器?
(为什么类开始卸载?)

4

1 回答 1

0

我在JBoss 类加载文档中找不到关于卸载类的参考。但是,如果您查看第12.7 章。JLS 的类和接口的卸载 只有在类加载器不再可访问时才能卸载一个类。这意味着必须首先取消部署应用程序。这是由 JVM 处理的,所以 JBoss 在这里不能做太多事情。

话虽如此,Java EE 不支持将内容存储在静态变量中。

你得到什么例外?NullPointerException? 您可以做的是附加一个调试器并检查and方法BookManager.class中的对象 ID。如果它是相同的(我假设)没有卸载发生。#init#getAllBooks

于 2012-12-17T10:04:19.930 回答