2012-12-20 85 views
7

在日志管理的getLogger()方法的描述中,它被写入以下:日志管理和垃圾收集器

与字符串名称相关联

“(...)记录器可以被垃圾收集在任何时间,如果没有强烈的引用记录器。这个方法的调用者必须检查返回值为null,以正确处理记录器被垃圾收集的情况。“

由于LogManager必须保留对所有记录器的所有引用才能够解析记录器的名称,GC怎么可能擦除记录器呢?

是不是有点奇怪,Java API允许的情况下,在我的应用程序开始时,我创建和设置我的记录器,但忘记保留refrences,然后如果我使用Logger.getLogger('someName ')我会得到我设置的记录器的新的默认一个实例吗?

回答

7

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

如果LogManager保持weak references到记录器(我相信它),这是可能的。

是不是觉得有点怪怪的,是Java的API允许的情况下,在那我的应用程序开始创建和安装我的记录仪,但忘记保持refrences,再后来,如果我使用Logger.getLogger( 'someName')我会得到我设置的记录器的新的默认一个实例吗?

有人可能会说,如果你关心你的记录,你应该保持一个参考吧。 documentation非常明确:

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