Иногда OutOfMemorError не означает, что куча объектов израсходована, а что-то еще. Была ли какая-либо другая информация о стеке ошибок?
В частности, JVM нужна группа памяти / адресного пространства, отдельная от пространства кучи. В какой-то момент, предоставив процессу больше кучи объектов, можно оставить меньше места для этого другого пула - как это ни парадоксально, сделать OOME более вероятным с большими настройками '-Xmx'!
Отображенные в память файлы могут занимать много адресного пространства; Неспособность закрыть файлы должным образом может оставить это место выделенным до GC / финализации, что происходит в непредсказуемое время. Кроме того, большая куча отодвигает GC / финализацию - это означает, что это собственное адресное пространство может оставаться зарезервированным дольше, и снова: большие кучи могут означать более частые OOME из-за истощения другой памяти.
Вы также можете использовать '-Xms' с тем же значением, чтобы принудительно захватить все адресное пространство кучи при запуске - возможно, вызвать сбой на более удобной / понятной / воспроизводимой стадии. * +1007 *
Наконец, есть также порог, при котором генерируется OOME, даже если ни один запрос памяти не завершился - но GC отнимает «слишком много» времени, указывая на то, что мусор создается так же быстро, как он собирается, вероятно, в узком цикле , Это может привести к большой неэффективной загрузке с диска, где создается много мусора для небольшого количества сохраняемых данных. Посмотрите [ограничение накладных расходов GC] для деталей.