Большинство GC выполняет копирование и сжатие, что позволяет избежать фрагментации. Только Concurrent Mark Sweep может получить некоторую фрагментацию, однако в большинстве случаев это не должно быть проблемой.
Вместо того, чтобы гадать, в чем может быть ваша проблема, я предлагаю вам оценить, что делает система. В идеале вы хотите профилировать свою производственную систему. например ночью или при низкой нагрузке. например VisualVM (бесплатно) или YourKit (лучше, не бесплатно!). Если это не вариант, вы можете отслеживать использование памяти и сколько времени он тратит на GCing. например с jstat
Однако, если вы не профилировали свое приложение, я предлагаю вам сделать это, потому что, вероятно, есть некоторые очевидные и простые вещи, которые вы можете сделать, чтобы улучшить производительность, даже если вы запускаете его в процессе разработки с достаточно реалистичной рабочей нагрузкой. .
Вы уверены, что ваши серверы не сканируются веб-сканерами? (Они не спят и могут быть активными в любое время дня и ночи)