Я не уверен, сколько из этого есть в вашем коде и сколько может быть в инструментах, которые вы используете, но есть некоторые ключевые вещи, на которые стоит обратить внимание.
Один из худших случаев, если вы постоянно добавляете к строкам в циклах. Простой «привет» + «мир» вообще не проблема, на самом деле он очень умен, но если вы делаете это в цикле, он будет постоянно перераспределять строку. Используйте StringBuilder, где вы можете.
Существуют профилировщики для Java, которые должны быстро указать вам, где происходит распределение. Просто поэкспериментируйте с профилировщиком некоторое время, пока ваше java-приложение работает, и вы, вероятно, сможете сократить свои GC практически до нуля, если проблема не в ваших библиотеках - и даже тогда вы можете найти какой-то способ ее исправить.
Вещи, которые вы выделяете, а затем освобождаете быстро, не требуют времени на этапе GC - это в значительной степени бесплатно . Убедитесь, что вы не держите струны дольше, чем вам нужно. Введите их, обработайте и вернитесь в предыдущее состояние, прежде чем возвращаться из обработчика запросов.