[ 
https://issues.apache.org/jira/browse/LOG4J2-2954?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Carter Kozak resolved LOG4J2-2954.
----------------------------------
    Fix Version/s: 2.14.0
       Resolution: Fixed

I've merged the first approach to both release-2.x (for 2.14.0) and master. 
Happy to consider the second approach, but I want to make sure some version of 
the fix makes the 2.14.0 release.

> 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
>             Fix For: 2.14.0
>
>
> 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)

Reply via email to