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はここでは多くのことを実行できません。

そうは言っても、静的変数への格納はJavaEEではサポートされていません。

あなたが得る例外は何ですか?NullPointerException?できることは、デバッガーを接続BookManager.classし、#initand#getAllBooksメソッドでのオブジェクトIDを確認することです。それが同じである場合(私が推測する)、アンロードは発生しませんでした。

于 2012-12-17T10:04:19.930 に答える