在LogManager的getLogger()方法的描述中,它写成如下:
“(...)如果没有对Logger的强引用,则可以随时对与String名称关联的记录器进行垃圾回收。此方法的调用者必须检查null的返回值,以便正确处理Logger被垃圾收集的情况。“
GC如何可以擦除记录器,因为LogManager必须保留对所有记录器的所有引用才能解析记录器的名称?
这有点奇怪,Java API允许一种情况,在我的应用程序开始时我创建和设置我的Loggers但忘记保留refrence,然后如果我使用Logger.getLogger('someName' )我将建立新的,默认的一个我记录器的instad?
答案 0 :(得分:7)
GC如何可以擦除记录器,因为LogManager必须保留对所有记录器的所有引用才能解析记录器的名称?
如果LogManager
将weak references保留给记录器(我相信它会这样做),就有可能。
这有点奇怪,Java API允许一种情况,在我的应用程序开始时我创建和设置我的Loggers但忘记保留refrence,然后如果我使用Logger.getLogger('someName' )我将建立新的,默认的一个我记录器的instad?
有人可能会说,如果你关心你的记录器,你应该保留它的参考。 documentation非常明确:
应用程序应保留自己对Logger对象的引用,以避免它被垃圾回收。 LogManager可能只保留弱引用。