2012-12-20 114 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只能保留一個弱引用。