Вы можете заставить старый буфер немедленно освободить память с помощью
((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
person
Peter Lawrey
schedule
05.03.2012