7

在LogManager的getLogger()方法的描述中是这样写的:

"(...)如果没有对 Logger 的强引用,与 String 名称关联的 Logger 可能随时被垃圾收集。此方法的调用者必须检查返回值是否为 null,以便正确处理记录器已被垃圾收集。”

GC 怎么可能擦除 Logger,因为 LogManager 必须保留对所有 Logger 的所有引用才能解析 Logger 的名称?

这不是有点奇怪吗,Java API 允许在我的应用程序开始时创建和设置我的 Loggers 但忘记保留引用,然后如果我使用 Logger.getLogger('someName') 我会获取我设置的新的、默认的一个记录器?

4

1 回答 1

8

GC 怎么可能擦除 Logger,因为 LogManager 必须保留对所有 Logger 的所有引用才能解析 Logger 的名称?

如果LogManager保持对记录器的弱引用是可能的(我相信它确实如此)。

这不是有点奇怪吗,Java API 允许在我的应用程序开始时创建和设置我的 Loggers 但忘记保留引用,然后如果我使用 Logger.getLogger('someName') 我会获取我设置的新的、默认的一个记录器?

有人可能会争辩说,如果你关心你的记录器,你应该保留对它的引用。文档对此非常清楚:

应用程序应该保留自己对 Logger 对象的引用,以避免它被垃圾收集。LogManager 可能只保留一个弱引用。

于 2012-12-20T18:01:47.183 回答