Запрет OutOfMemory при использовании java.nio.MappedByteBuffer

Рассмотрим приложение, которое создает 5-6 потоков, каждый поток в цикле выделяет MappedByteBuffer для размера страницы 5 МБ.

MappedByteBuffer b = ch.map(FileChannel.MapMode.READ_ONLY, r, 1024*1024*5);

Рано или поздно, когда приложение работает с большими файлами, oom выбрасывается

java.io.IOException: Map failed  at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:758)
Caused by: java.lang.OutOfMemoryError: Map failed
        at sun.nio.ch.FileChannelImpl.map0(Native Method)
        at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:755)

Согласно спецификации, MappedBuffer должен распоряжаться прямой памятью, как только это сам GC. Похоже, проблема в том, что MappedBuffer-ы слишком поздно обрабатываются в GC, позже закончилось прямое запоминание.

Как избежать этой ситуации? Вероятно, скажите, что MappedBuffer неявно расположен, или используйте какой-то пул MappedBuffer.

Ответы на вопрос(4)

Ваш ответ на вопрос