簡體   English   中英

RythmEngine和TemplateClassManager堆的最大對象:內存泄漏問題

[英]RythmEngine and TemplateClassManager the Biggest Objects of the heap : memory leak problems

在我的公司,我們正在使用Rythm,因為它的設施和在項目中的易用性。 在我們的項目中,我們發送了幾封電子郵件(白天發送1000-2000封電子郵件); 電子郵件模板是具有動態語法(Java代碼)的Rythm模板。 性能似乎很好,它通過了集成測試。

盡管如此,我們已經嘗試了幾個內存問題,這些問題在3-4天后會導致內存泄漏。 分析,我們觀察到Rythm是堆中最大的對象(我們的分析大約是1天),甚至比Spring中的ClassLoader或BeanFactory還要多。

使用堆工具分析器,我們觀察到RythmEngineTemplateClassManager是最大的對象

 (Instance) - (retained size bytes)

org.rythmengine.RythmEngine#1 - 10,192,894
org.rythmengine.internal.compiler.TemplateClassManager#1 - 9,223,065
org.springframework.boot.loader.LaunchedURLClassLoader#1 - 6,975,661
java.util.Vector#89 - 6,378,290
java.lang.Object[]#7549 - 6,378,254
org.springframework.beans.factory.support.DefaultListableBeanFactory#1 - 3,741,643

......

我們可以從堆分析器工具中看到這些對象是大對象,並且它們似乎在時間上增加。

在此輸入圖像描述

和GC根。

在此輸入圖像描述

關於內存池:Par Eden似乎很好,CMS老一代似乎沒有增加,或者至少是緩慢增長(即使在一些主要的GC之后它似乎是免費記憶)。 堆內存似乎很好(測試和分析大約一天),但是在生產到達最大堆后緩慢增加。

我們詢問是否有人嘗試過此功能(使用rythm並在幾天后出現內存泄漏)或者只是提供一些如何在生產環境中使用rythm提高性能的最佳實踐。 或者歡迎任何關於如何處理深度內存泄漏的想法。

重要說明 [30-09-2015]: 我們已經從Rythm更改為FreeMarker作為模板引擎 ,它似乎(正如我們的監控系統所反映的) 內存更穩定,大約是最大內存的20% (-Xmx1024)。 我們將在本周告知更詳細的信息。 但似乎Rythm可能會遇到一些內存問題,幾天之后它就會導致內存泄漏。

重要說明 [06-10-2015]:經過幾天的密集監控后,我們使用FreeMarker作為模板引擎檢查了內存是否穩定。 我們已經刪除了Rythm在我們產品中的所有依賴關系,因為我們的研究反映它有一個潛在的內存泄漏問題沒有解決 ,在幾天之后(在我們的例子中為兩天)驅動到OOME堆。 問題已結束。

我們也面臨並遇到過這樣的問題但是因為一次又一次地編譯模板。 為避免這種情況,我們進行了以下設置,啟用prod模式啟用模板緩存設置模板編譯目錄位置 - 存儲模板文件的編譯版本。 (不要混淆模板目錄配置)這將提高您的應用程序速度。

Map<String, Object> rythmConfigs = new HashMap<>();
        //rythmConfigs.put(ENGINE_MODE, this.appMode ? "prod" : "dev");
        rythmConfigs.put(PRECOMPILE_MODE_ENABLED, this.config.getBoolean(PRECOMPILE_MODE_ENABLED, true));
        rythmConfigs.put(LOAD_PRECOMPILED_ENABLED, this.config.getBoolean(LOAD_PRECOMPILED_ENABLED, true));
        rythmConfigs.put("rythm.default.cache_ttl", Integer.MAX_VALUE);
        rythmConfigs.put("rythm.cache.enable", this.appMode);
        //rythmConfigs.put("cache.prod_only.enabled", this.appMode);
        rythmConfigs.put(PRECOMPILED_DIR, getTempDir(config.getString(XoAppConfigKeys.APPLICATION_CONTEXT)).getAbsolutePath());
        rythmConfigs.put(TEMPLATE_DIR, this.templateFolderUri.getPath());
        rythmEngine = new RythmEngine(rythmConfigs);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM