[英]Parameterized logging in a Webapp with garbage-free Log4j
收集的事實:
log4j 2.6提供了無垃圾日志記錄,它不是每次都創建新字符串,而是重用threadlocal中保存的stringbuilder。
默認情況下,在webApps中禁用無垃圾模式的log4j,因為webApps重用線程,並且在線程中保存日志會導致stringBuilder在幾天內建立起來。
我在WebApp中使用log4j,並驗證ENABLE_THREADLOCALS
字段為false。
當我以下列方式登錄時:
log.info("log statement with parameter {}", someString);
log.info(""log statement with concatenation " + someString");
我看到,即使在完全GC之后,第一個語句仍保留在堆內存中。 第二個陳述沒有的地方。
我瀏覽了log.info的代碼,發現第一個使用“ ParameterizedMessage
”,而第二個使用“ SimpleMessage
”。
ParametrizedMessage
創建是使用ThreadLocal
完成的,即使對於WebApp也是如此,它有一個注釋:
"// storing JDK classes in ThreadLocals does not cause memory leaks in web apps, so this is okay"
我的問題是,上述評論是否正確,因為我在webApp中使用{}時遇到內存泄漏問題。
PS:重新啟動webApp時沒有問題。 一切都在重新啟動時清除。 但是當webApp連續運行數天並且threadLocals的大小不斷增加時,這是一個問題。
你似乎遇到了一個錯誤: https : //issues.apache.org/jira/browse/LOG4J2-1417
org.apache.logging.log4j.util.Unbox類在靜態ThreadLocal字段中存儲非JDK類(Unbox $ State)。
這可能會導致在應用程序之間共享線程池的容器中發生內存泄漏。
嘗試使用2.6.2或更高版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.