Henry Tung created LOG4J2-2954:
----------------------------------

             Summary: Shutdown callbacks registered in 
LoggerContext.setUpShutdownHook() aren't strongly referenced
                 Key: LOG4J2-2954
                 URL: https://issues.apache.org/jira/browse/LOG4J2-2954
             Project: Log4j 2
          Issue Type: Bug
            Reporter: Henry Tung


LoggerContext.setUpShutdownHook() passes a callback to the 
DefaultShutdownCallbackRegistry. To "avoid a memory leak", the registry only 
holds a soft reference to the passed callback.

However, the callback is itself just an inline lambda not-otherwise-referenced. 
Even while the context is alive, the callback will soon become eligible for GC 
once the SoftReference timer-from-last-access expires. By the time the shutdown 
hooks actually run, the references are cleared and the context is not 
gracefully closed.

Probably surfaced after 
[https://github.com/apache/logging-log4j2/commit/bee90521bb63e6162a9cbed606adde4242675c62.]
 "Fixing" that leak (which actually kept the callback alive) now makes the 
callback completely unreferenced (strongly).

An improvement would be to make RegisteredCancellable.hook a strong reference, 
and instead to make DefaultShutdownCallbackRegistry.hooks a 
Collection<WeakReference<...>>. This would keep the callback alive as long as 
the returned registration object (the Cancellable) is alive, and the 
LoggerContext does reference that.

------

Note: Unclear if the above is actually a complete solution. "LoggerContext 
eligible for GC" doesn't seem to imply "LoggerContext contents all flushed to 
disk" - the strong reference from the shutdown hook to the context actually 
seems correct in that context, to guarantee that contents will be flushed on 
finish.

Instead, re: "memory leak", it seems like there should be a burden on Log4j API 
consumers to close old contexts they don't need anymore.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to