[
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)