Как найти утечку памяти с com.opensymphony.oscache в устаревшем Java-приложении
У меня есть старое унаследованное Java-приложение, которое несколько раз в неделю начинает работать очень медленно, и мне нужно перезапустить Tomcat.
Я проверил журналы "Новые транзакции" и "Ошибки", но не могу найти источник проблемы. Похоже, что главные транзакции являются скорее следствием, чем источником проблемы.
Итак, я предполагаю, что это может быть утечка памяти, и я сделал дамп кучи и попытался проанализировать его на Eclipse Memory Analyzer, но у меня возникают трудности с выявлением утечки памяти и действительно ли это утечка памяти.
Похоже, проблема подозреваемого 1 является com.opensymphony.oscache.web.ServletCache.
Вот некоторые из результатов Memory Analyzer:
Также это монитор VisualVM:
Спасибо! Любая помощь или руководство с этим было бы очень полезно!
Это файл 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.