Как найти утечку памяти с com.opensymphony.oscache в устаревшем Java-приложении

У меня есть старое унаследованное Java-приложение, которое несколько раз в неделю начинает работать очень медленно, и мне нужно перезапустить Tomcat.

Я проверил журналы "Новые транзакции" и "Ошибки", но не могу найти источник проблемы. Похоже, что главные транзакции являются скорее следствием, чем источником проблемы.

Итак, я предполагаю, что это может быть утечка памяти, и я сделал дамп кучи и попытался проанализировать его на Eclipse Memory Analyzer, но у меня возникают трудности с выявлением утечки памяти и действительно ли это утечка памяти.

Похоже, проблема подозреваемого 1 является com.opensymphony.oscache.web.ServletCache.

Вот некоторые из результатов Memory Analyzer:

Резюме

Гистограмма

Проблема Подозреваемый 1

Также это монитор VisualVM:

VisualVM Monitor

Спасибо! Любая помощь или руководство с этим было бы очень полезно!

Это файл oscache.properties:

cache.memory=true
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener
cache.path=/home/oscache/tb

2 ответа

Решение

Несколько вещей, которые я бы посоветовал решить с этой проблемой.

Используйте кеширование диска вместо кеша памяти, если ваши варианты использования позволяют:

В файле конфигурации для oscache

cache.memory=false
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
cache.path=/opt/myapp/cache
cache.capacity=1000

Если кеш диска не рекомендуется, попробуйте уменьшить емкость кеша

cache.capacity=1000

Пожалуйста, предоставьте детали конфигурации oscache для лучшего обзора, если это возможно.

Обновить

HashDiskPersistenceListener используется, когда свойство cahce.memory=false

У нас есть два варианта, чтобы попробовать

1) укажите значение емкости кеша

cache.capacity=1000 #or a value that covers the usecase

2) заставить кеш использовать стойкость диска

cache.memory=false

Я бы предложил использовать пробную версию YourKit Java Profiler, она даст вам гораздо больше подробностей о вашем устаревшем коде приложения. Вот ссылка: я использовал этот инструмент еще в 2014 году в качестве пробной версии для обнаружения утечек памяти в веб-приложении на основе Struts 2 и Hibernate.

Ваш комплект

Другие вопросы по тегам