Рассмотрите приложение, которое создает 5-6 потоков, каждый поток в цикле выделяет MappedByteBuffer для размера страницы 5mb.Предотвращение OutOfMemory при использовании java.nio.MappedByteBuffer
MappedByteBuffer b = ch.map(FileChannel.MapMode.READ_ONLY, r, 1024*1024*5);
Рано или поздно, когда приложение работает с большими файлами, оот брошено
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's GC-ed слишком поздно, а затем завершена прямая память.
Как избежать этой ситуации? Вероятно, MappedBuffer может использовать неявно или использовать какой-то пул MappedBuffer
любопытства, что ваш код делает? – fge
Исключение составляет ** NOT OOM **, но IOException. У вас закончилось виртуальное адресное пространство. Покажите еще немного кода. Mapped buffers и reclamation в java - это долговременные проблемы (все еще нерешенные изящно) – bestsss