問題描述
使用 Spring 和 Log4j2 的 Classloader‑Leak (Classloader‑Leak with Spring and Log4j2)
我正面臨一個類加載器洩漏,我能夠在一個只有兩個類和幾行代碼的小項目中重新生成它。只要使用記錄器 (Log4j2),就會發生這種情況。
問題: 多次部署應用程序時,類會一次又一次地加載,直到 PermGen 空間達到其限制.
重現步驟: 下載這個包含兩個類的小型 Maven 項目。如下所示。
- 在標準 tomcat 7 上部署應用程序
- 啟動 jvisualvm 並監控 tomcat 實例
- 取消部署應用程序
- 再次部署應用程序...即使您點擊“執行 gc”按鈕,類也不會被刪除。
我已經嘗試過但沒有成功:
- 在非靜態字段中使用記錄器
- 使用“‑XX:+CMSClassUnloadingEnabled ‑XX:+UseConcMarkSweepGC”啟動虛擬機
- 在 Spring bean 中定義記錄器
你有什麼想法,如何解決這個問題?提前致謝!
參考解法
方法 1:
There are a number of known memory leak issues with log4j version 2.4 and 2.4.1. The upcoming version log4j‑2.5 will address all of these.
(by Christian、Remko Popma)