日志管理和垃圾收集器

7
在LogManager的getLogger()方法描述中,写道以下内容:
“(...)与字符串名称相关联的记录器如果没有对记录器的强引用,则可以随时被垃圾回收。调用此方法的调用者必须检查返回值是否为null,以便正确处理记录器已被垃圾回收的情况。”
既然LogManager必须保留所有记录器的引用才能解析记录器的名称,那么GC如何擦除记录器呢?
Java API允许这种情况似乎有点奇怪,即在我的应用程序启动时创建和设置记录器,但忘记保留引用,然后稍后如果我使用Logger.getLogger('someName'),我将得到新的默认记录器而不是我设置的记录器。
1个回答

8

GC如何能够删除Logger,因为LogManager必须保留对所有Logger的引用,以便能够解析Logger的名称?

如果LogManager使用弱引用来保存日志记录器(我相信它确实这样做),那么就有可能发生这种情况。

Java API允许这种情况,我在应用程序启动时创建和设置我的Loggers但忘记保留引用,然后稍后如果我使用Logger.getLogger('someName'),我将得到新的默认Logger而不是我设置的Logger,这不是有点奇怪吗?

可以这样说,如果您关心自己的日志记录器,就应该保留对它的引用。 文档非常明确:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接