Prevent OutOfMemory ao usar java.nio.MappedByteBuffer

Considere o aplicativo, que cria de 5 a 6 segmentos, cada segmento no ciclo aloca MappedByteBuffer para um tamanho de página de 5 M

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

Mais cedo ou mais tarde, quando o aplicativo trabalha com arquivos grandes, oom é lançado

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)

De acordo com a especificação, o MappedBuffer deve dispor de memória direta assim que for o próprio GC. Parece que o problema é que os MappedBuffer-s são editados por GC tarde demais, depois a memória direta é finalizad

Como evitar esta situação? Provavelmente diga ao MappedBuffer que descarte implicitamente ou use algum tipo de pool de MappedBuffer

questionAnswers(4)

yourAnswerToTheQuestion