在JBoss AS 7.1.1 Final上卸载类?

时间:2012-12-16 17:17:45

标签: java java-ee classloader


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

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

1 个答案:

答案 0 :(得分:0)

我找不到JBoss class loading documentation中卸载类的引用。但是,如果查看JLS的第12.7. Unloading of Classes and Interfaces章,只有在不再可以访问类加载器时才能卸载类。这意味着必须首先取消部署应用程序。这是由JVM处理的,因此JBoss在这里做不了多少。

说到这里,Java EE不支持将内容存储在静态变量中。

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