Использование памяти FileChannel # map - PullRequest
3 голосов
/ 08 мая 2009

Распределяет ли FileChannel#map всю память, необходимую для результирующего ByteBuffer немедленно, или она выделяется только по требованию во время чтения из буфера?

Я только что попытался отобразить все файлы размером более 500 МБ в тривиальной тестовой программе и посмотрел на использование памяти процессом. (Используя как Runtime#totalMemory, так и следя за ним в OS X Activity Monitor для процесса groovysh.) Использование памяти никогда не превышало 30-ти МБ.

Итак, может ли реализация Java "спрятать" часть своего использования памяти в нативных вызовах? И если так, есть ли способ узнать, сколько это на OS X?

Ответы [ 3 ]

4 голосов
/ 08 мая 2009

Использование памяти никогда не бывает простым. Фактический буфер, используемый FileChannel.map, не является частью кучи Java. Действительно, память может быть разделена с другими процессами. Файл может даже не читаться с диска до тех пор, пока не будут затронуты страницы.

1 голос
/ 18 марта 2012

java.nio.MappedByteBuffer # load запускает загрузку всего содержимого файла в память (в противном случае это по требованию):

Этот метод делает все возможное, чтобы при возвращении * содержимое этого буфера находится в физической памяти. Вызывая это * метод может вызвать некоторое количество ошибок страниц и операций ввода-вывода в * встречаются.

1 голос
/ 08 мая 2009

Да. Это не часть кучи. Тем не менее, в зависимости от ОС все еще будет зарезервирована память. В OS X, потому что он похож на UNIX, вы должны иметь возможность использовать top или ps, чтобы проверить, сколько памяти ему нужно.

...