Вы можете заставить старый буфер немедленно освободить память с помощью
((DirectBuffer) buffer).cleaner().clean();
Отказ от ответственности: я использовал это только с Sun / Oracle / OpenJDK Java 6 обновление 18 и более поздние версии. Он может быть недоступен или работать некорректно со старыми версиями или другими платформами. Спасибо @ EJP.
Если у вас нет 32-битной ОС, я бы просто отобразил весь файл в память (используя несколько отображений). Это будет намного эффективнее и проще в управлении. В этой ситуации я очищаю ByteBuffers только как часть закрытия файла (в модульных тестах)
Вы можете использовать ТБ виртуальной памяти и использовать очень мало физического или даже дискового пространства. В этом примере я сопоставляю 8 ТБ виртуальной памяти на машине с 24 ГБ памяти и диском на 120 ГБ.
http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html
В итоге: на 64-битной машине виртуальная память удивительно дешевая, вам не о чем беспокоиться.
Кстати: большинство 64-битных машин фактически ограничены 48-битной виртуальной памятью. Это предел 256 ТБ, а не 16 ЭБ (18 000 000 ТБ), которые они могут решить теоретически.
Вы можете найти эту библиотеку интересной. Я не упоминал об этом раньше, поскольку он может не подходить для вас, но вы можете найти подход и некоторые методы, которые я использую в коде, интересными.
https://github.com/peter-lawrey/Java-Chronicle