[ https://issues.apache.org/jira/browse/LOG4J2-2954?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17225473#comment-17225473 ]
ASF subversion and git services commented on LOG4J2-2954: --------------------------------------------------------- Commit a3e31f76dd13a5e3da8584fc75a4380da206454a in logging-log4j2's branch refs/heads/release-2.x from Henry Tung [ https://gitbox.apache.org/repos/asf?p=logging-log4j2.git;h=a3e31f7 ] LOG4J2-2954 Retain strong reference to shutdown callbacks Make sure the returned Cancellable handler contains a strong reference to the callback, so that it is not garbage-collected prematurely. Add Javadoc note about collection semantics. > 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 > Components: Core > Affects Versions: 2.13.3 > Reporter: Henry Tung > Assignee: Carter Kozak > Priority: Major > > 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). > Suggested fix: > * make RegisteredCancellable.hook a strong reference > * 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 necessary, to guarantee that any buffers in the context will be flushed > even if the context itself happens to become unreferenced. -- This message was sent by Atlassian Jira (v8.3.4#803005)