OpenJDK は、潜在的非互換性を取り入れました。特に、java.util.logging.Logger は振る舞いが変更されています。 強参照を使用する代わりに、現在、内部的に弱参照を使用しています。 それは理にかなった変更ですが、残念ながらいくつかのコードは古い振る舞いに依存しています。 ロガーの構成を変更するとき、ロガーへの参照を捨てます。 つまり、ガベージコレクタはそのメモリを回収できます。それは、ロガーの構成が失われることを意味します。 たとえば、以下を検討してください。
public static void initLogging() throws Exception { Logger logger = Logger.getLogger("edu.umd.cs"); logger.addHandler(new FileHandler()); // ロガーの構成の変更 logger.setUseParentHandlers(false); // 別のロガーの構成の変更 }
ロガーの参照は、メソッドの終わり (メソッドは脱出しません) で失われるので、
initLogging
の呼び出しの後でガベージコレクションの循環があるなら、ロガー構成は失われます (なぜなら Logger は弱参照を保持するだけなので)。
.
public static void main(String[] args) throws Exception { initLogging(); // ファイルハンドラーをロガーに追加する System.gc(); // ロガーの構成が失われる Logger.getLogger("edu.umd.cs").info("Some message"); // 期待したようにファイルに記録されません }
Ulf Ochsenfahrt と Eric Fellheimer