java - это - RythmEngine и TemplateClassManager-самые большие объекты кучи: проблемы с утечкой памяти



утечка памяти java это (1)

Мы столкнулись с такой проблемой и столкнулись с ней из-за компиляции шаблонов снова и снова. Чтобы этого избежать, мы выполнили следующие настройки: Включить режим 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);

В моей компании мы используем Rythm благодаря своему объекту и простому использованию в проекте. В нашем проекте мы отправляем несколько электронных писем (1000-2000 писем в день); шаблон электронной почты - это шаблон ритма с динамическим синтаксисом (код Java). Производительность кажется прекрасной, и она прошла интеграционные тесты.

Тем не менее, мы экспериментировали с несколькими проблемами памяти, которые приводят к утечке памяти через 3-4 дня. Профилирование, мы заметили, что Rythm - самый большой объект кучи (наши профилирования составляют около 1 дня) даже больше, чем ClassLoader или BeanFactory с весны.

Используя анализатор кучного инструмента, мы заметили, что RythmEngine и TemplateClassManager являются крупнейшими объектами

 (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 Root.

Что касается пулов памяти: Par Eden кажется прекрасным, и CMS Old Generation, кажется, не увеличивается или, по крайней мере, медленно (даже после некоторых крупных GC кажется, что свободная память). Память кучи кажется прекрасной (тесты и профилирование составляют около одного дня), но в производстве медленно возрастает после достижения максимальной кучи.

Мы спрашиваем, кто-то экспериментировал с этой функцией (используя ритм, а через несколько дней обнаруживает утечку памяти) или просто дайте несколько рекомендаций о том, как повысить производительность с ритмом в производственной среде. Также будет приветствоваться любая идея о том, как бороться с утечкой памяти глубины.

ВАЖНОЕ ЗАМЕЧАНИЕ [30-09-2015]: Мы изменили с Rythm на FreeMarker в качестве механизма шаблонов, и кажется (как наши системы мониторинга), что память более стабильна и составляет около 20% от максимальной памяти (-Xmx1024). Мы расскажем более подробно на этой неделе. Но, похоже, что у Rythm могут быть проблемы с памятью, которые через пару дней он вытесняет утечку памяти.

ВАЖНОЕ ПРИМЕЧАНИЕ [06-10-2015]: после нескольких дней интенсивного мониторинга мы проверили, что память стабильна с использованием FreeMarker в качестве механизма шаблонов. Мы удалили все зависимости Rythm в нашем продукте, потому что, как показывают наши исследования, у него есть потенциальная проблема с утечкой памяти, которая не решена, что приводит к нехватке для кучи через несколько дней (в нашем случае два дня). Проблема закрыта.





rythm