Если приложение сжирает слишком много памяти, либо сильно грузит проц, то можно на скорую руку сделать его профилирование.
Ниже представлены команды, которые, при запуске на сервере, могут дать понять - в чём проблема.
Отображение потребления ресурсов потокам
С помощью диспетчера процессов top, можно отобразить список потоков приложения:
top -H -p 20345
где 20345 - это PID запущенного процесса Вашего приложения
Сэмплинг
Помогает найти тормозные методы в приложении. Суть метода заключается в выполнении скоупа нескольких одинаковых запросов. Каждый запрос показывает методы, в которых в данный момент находятся потоки приложения. Таким образом, если в нескольких запросах фигурирует один и тот же метод, то можно предположить, что он является очень долгим и, возможно, требует оптимизации.
Команда для выполнения одного запроса:
jstack 20345 | grep ru.knastnt
где 20345 - это PID запущенного процесса Вашего приложения (можно узнать в диспетчере процессов top),
ru.knastnt - корневое имя всех пакетов в моём приложении. Это нужно чтобы показывать только методы, написанные непосредственно мной. Потому что без grep, будут выведены методы из всех пакетов всех библиотек и фреймворков, которые использует Ваше приложение.
Также есть замечательная статья по использованию jstack, которая описывает, например, как отследить дедлоки или методы сильно загружающие процессор.
Использование памяти
А это способ отследить под что использована память. Команда выведет:
порядковый номер, кол-во инстансов, объём памяти, имя класса
jmap -histo 20345 | more
или
jmap -histo 20345 | grep ru.knastnt
где 20345 - это PID запущенного процесса Вашего приложения (можно узнать в диспетчере процессов top),
ru.knastnt - корневое имя всех пакетов в моём приложении. Это нужно чтобы показывать только объекты, написанные непосредственно мной.
Также можно использовать такую конструкцию для предварительного запуска сборки мусора:
jmap -histo:live 20345 | grep ru.knastnt