Файлы памяти Java сопоставлены и подкачки - PullRequest
1 голос
/ 06 апреля 2010

Я смотрю на некоторые файлы отображения памяти в Java. Допустим, у меня установлен размер кучи 2 ГБ, и я сопоставляю файл памяти размером 50 ГБ - намного больше, чем физическая память на машине. Операционная система будет кэшировать части этого 50-гигабайтного файла в кеше os-файла, процесс java будет иметь 2 ГБ пространства кучи. Что меня интересует, так это то, как ОС решает, сколько файлов размером 50 ГБ кэшировать?

Например, если у меня есть другой процесс java, также с размером кучи 2 ГБ, будет ли он заменен на 2 ГБ, чтобы ОС могла кэшировать части файла отображения памяти? Будут ли заменены части пространства кучи первого процесса для кэширования ОС?

Есть ли способ сказать ОС, чтобы она не переставляла пространство кучи для кэширования ОС? Если ОС не меняет основные процессы, как она определяет размер своего файлового кэша?

1 Ответ

2 голосов
/ 06 апреля 2010

Linux на самом деле не делает различий между анонимными и отображаемыми в памяти страницами. Все они загружаются по требованию в любом случае через ошибки страницы.

Вы можете думать об анонимной памяти, как если бы она была частным отображением памяти / dev / zero.

Таким образом, вы можете отобразить столько, сколько захотите (разрешение адресного пространства, но я предполагаю, что вы находитесь на 64-битном поле здесь). Linux загружает их только тогда, когда процесс касается их, через сбои страниц.

Аналогично, в нем хранятся некоторые записи о том, как недавно использовались страницы, поэтому они получают приоритет при отбрасывании.

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

Так что в ответ на ваш вопрос, нет, отображение большого файла не отнимает у кого-либо виртуальную память, если вы не читаете и не пишете страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...