Интересная проблема. Похоже, один из сборщиков мусора плохо работает в вашей конкретной ситуации.
Вы пытались изменить используемый сборщик мусора? Есть много вариантов GC, и выяснение, какие из них являются оптимальными, кажется черным искусством, но мне интересно, сработают ли базовые изменения для вас.
Я знаю, что есть GC «Сервер», который работает намного лучше, чем стандартные. Вы используете это?
Резьбовой ГХ (который, я считаю, используется по умолчанию), вероятно, является худшим для вашей конкретной ситуации, я заметил, что он обычно менее агрессивен, когда машина занята.
Одна вещь, которую я заметил, часто требуется два сборщика мусора, чтобы убедить Java действительно вынести мусор. Я думаю, что первый имеет тенденцию разъединять кучу объектов, а второй фактически удаляет их. То, что вы, возможно, захотите сделать, - это вызвать две сборки мусора. Это вызовет значительную паузу в GC, но я никогда не видел случая, чтобы очистка всей кучи заняла более двух.