Вообще мысль про фраг ентацию памяти годная. Я то же предполагаю, что это может быть GC. В какой-то момент пытается почистить и ты получаешь полное понимание пумы, а потом у него действительно куча не равномерно распределенных мест...
Могу еще посоветовать понаблюдать в мониторнге за спайками по CPU usage в момент, когда начинаются тормоза, поскольку если есть подозрение на GC, то он начинает резко потреблять CPU. Нельзя, конечно, ссылаться по аналогии, но в JVM как раз такая ситуация, что если GC настроен некорректно, и начинают работать stop-the-world паузы, CPU usage резко поднимается