7

LogManagerのgetLogger()メソッドの説明では、次のように記述されています。

"(...)文字列名に関連付けられたロガーは、ロガーへの強い参照がない場合、いつでもガベージコレクションされる可能性があります。このメソッドの呼び出し元は、次の場合を適切に処理するために、nullの戻り値を確認する必要があります。ロガーはガベージコレクションされました。」

LogManagerがロガーの名前を解決できるようにすべてのロガーへのすべての参照を保持する必要があるため、GCがロガーを消去できるのはどうしてですか?

少し奇妙なことではありませんが、Java APIは、アプリの開始時にロガーを作成してセットアップしますが、参照を保持するのを忘れて、後でLogger.getLogger('someName')を使用する場合に状況を許可します。私が設定したロガーの新しいデフォルトの1つのインストールを取得しますか?

4

1 に答える 1

8

LogManagerがロガーの名前を解決できるようにすべてのロガーへのすべての参照を保持する必要があるため、GCがロガーを消去できるのはどうしてですか?

ロガーへの弱参照LogManagerを保持している場合は可能です(私はそう信じています)。

少し奇妙なことではありませんが、Java APIは、アプリの開始時にロガーを作成してセットアップしますが、参照を保持するのを忘れて、後でLogger.getLogger('someName')を使用する場合に状況を許可します。私が設定したロガーの新しいデフォルトの1つのインストールを取得しますか?

ロガーを気にする場合は、ロガーへの参照を保持する必要があると主張する人もいるかもしれません。ドキュメントはそれについて非常に明確です:

アプリケーションは、ガベージコレクションを回避するために、Loggerオブジェクトへの独自の参照を保持する必要があります。LogManagerは弱参照のみを保持できます。

于 2012-12-20T18:01:47.183 に答える