Я бы начал с некоторых инструментов, которые помогут вам профилировать приложение. Поскольку вы разрабатываете веб-приложение, начните с лямбда-зонд и мелодия Java .
Первым шагом является определение условий, при которых приложение начинает вести себя странно. Задайте себе несколько вопросов:
- Возникают ли проблемы с производительностью сразу после запуска приложений или сверхурочно?
- Связаны ли проблемы производительности с количеством клиентских запросов?
- В чем реальная проблема производительности - высокая нагрузка на сервер или нехватка памяти (обратите внимание, что они связаны, поэтому проверьте, какой из них запускается первым)
- Существуют ли какие-либо фоновые процессы, выполняющие некоторые массивные операции? Они запланированы для запуска в определенный период времени?
Попробуйте найти некоторые подсказки, прежде чем углубляться в код. Это поможет вам сузить возможные причины.
Как сказал Джошуа Блох в своей книге, озаглавленной «Эффективная Java», проблемы с производительностью редко являются следствием незначительных ошибок в исходном коде (хотя, конечно, неправильное использование конструкций Java может привести к катастрофе). Обычно причиной является плохая системная (API) архитектура.
Последнее предложение, основанное на моем опыте - постарайтесь не думать, что высокое потребление памяти - это что-то плохое. Tomcat будет использовать столько же памяти, сколько и операционная система, и JVM позволит ему (не более максимальных настроек), и только когда ему потребуется больше - Tomcat выполнит сборку мусора. Таким образом, типичный (правильный!) График потребления памяти выглядит как пила. Если вы имеете дело с утечкой памяти, то график будет увеличиваться постоянно, но бесконечно. Это наиболее часто неправильно понимаемая утечка памяти, так что имейте это в виду.
Если честно - мы не можем вам помочь намного дальше. Это всего лишь указатели, теперь вам придется провести обширное исследование, чтобы выяснить причину:)