Во-первых, позвольте мне сказать, что вы не одиноки. Это почти наверняка самый распространенный вопрос в области «Windows» + «Память» здесь. Он вполне может быть в первой десятке по всему SuperUser. И я обвиняю Microsoft в том, что она не объясняет ничего хорошего, не использует правильные, непротиворечивые имена для метрик на нескольких дисплеях и не предоставляет простой для поиска и отслеживания ответ на этот вопрос, несмотря на его «популярность».
Короче, твоя путаница понятна, даже ожидаема. Это не твоя вина.
Быстрый ответ
Если вы видите «из памяти», «мало памяти» и т.д., всплывающие окна Windows, вы действительно, действительно, действительно нужно иметь файл подкачки. Или увеличьте размер того, который у вас уже есть.
(Или добавьте больше оперативной памяти, но это не так просто. Или попробуйте одновременно запустить меньше / меньше программ, но никто не хочет этого делать.)
Я отключил его, потому что у меня есть 250 ГБ SSD.
Извините за грубость, но это не имеет никакого смысла. Если бы вы сказали «... потому что у меня 64 ГБ ОЗУ», это имело бы смысл. Может быть. Но наличие SSD не означает, что вам не нужен файл подкачки.
Даже наличие 64 ГБ ОЗУ не гарантирует, что вам не нужен файл подкачки!
Это сообщение об ошибке на самом деле говорит вам, что вам абсолютно необходим файл подкачки. (Или больше оперативной памяти ... или вам нужно запускать меньше и меньше или меньше).
Да, я знаю. Вы не хотите помещать файл подкачки на свой SSD. Я рассмотрю это в конце.
Когда он говорит «из памяти», это не означает, что вы думаете, что означает
Это сообщение об ошибке выдается из-за нехватки памяти, называемой «Commit Limit». «Зафиксированный», или, скорее, «частный заем», чтобы дать ему полное имя, является типом виртуальной памяти в Windows. Вы, вероятно, знаете, что содержимое «виртуальной памяти» находится либо в ОЗУ, либо, если для него не хватает места, часть его хранится на диске (или SSD). Для "частной выделенной виртуальной памяти" место на диске хранится в файле подкачки. Если у тебя есть.
(Существует также «отображенная» виртуальная память, которая использует другие файлы для подкачки страниц вместо файла подкачки, и есть нестраничная виртуальная память, которая должна постоянно находиться в оперативной памяти. Nonpageable vm способствует «фиксации заряда», так что если у вас есть слишком большая его часть может привести к появлению сообщения об ошибке «недостаточно памяти». Отображенная память не вносит такой вклад, поэтому я не буду обсуждать это здесь.)
Что делать, если у вас нет файла подкачки? Ваши программы все еще могут создавать частную выделенную виртуальную память. Но затем вся выделенная виртуальная память, которая была записана с момента ее первого выделения, должна постоянно оставаться в ОЗУ ... до тех пор, пока она не будет освобождена (обычно путем завершения процесса, который ее создал) ... Потому что Windows больше нет места для Оставь это.
«Совершить предел» - то есть, сколько совершено, написанном к по- крайней мере, один раз виртуальной памяти, которые вы можете иметь - поэтому просто размер оперативной памяти плюс текущий размер вашего файла подкачки. (Если у вас включено расширение файла подкачки, предел фиксации увеличивается, когда это делает файл подкачки.)
Если вы посмотрите на Диспетчер задач, вкладка «Производительность» в Windows 7, вы увидите индикацию, которая выглядит следующим образом:
Commit (MB) 893 / 4095
Это говорит о том, что мой объем закачки составляет 893 МБ, а мой предел закачки составляет 4095 МБ, т.е. 4 ГБ. (Это с виртуальной машины под управлением Windows 7. Она имеет 2 ГБ «ОЗУ» и файл подкачки 2 ГБ - таким образом, предел фиксации составляет 4 ГБ.)
Сообщение об ошибке «недостаточно памяти» появляется, когда программа пытается выделить выделенную виртуальную память, и запрос не может быть удовлетворен, поскольку системный «заряд» уже находится на уровне или близок к «пределу принятия» - достаточно близко, чтобы запрос, если предоставленный, возьмет на себя ответственность за лимит.
Обратите внимание, что вы видите это сообщение только после того, как запрос «commit» уже был предпринят и потерпел неудачу. Поэтому, когда вы смотрите на диспетчер задач, причина проблемы может быть не очевидна.
Предположим, у вас осталось 1 ГБ лимита, и что-то пытается выделить 1,5 ГБ за один вызов. (Это необычно, но это может случиться.) Диспетчер памяти отклонит запрос, и вы увидите всплывающее окно. Но затем, когда вы посмотрите на диспетчер задач, вы все равно увидите, что ваш коммит был прежним, а 1 ГБ по-прежнему не используется! Смешение. В диспетчере задач, мониторе ресурсов или даже в системном мониторе нет ничего, что сообщало бы вам, сколько было запрошено.
(Инструмент «Монитор процессов» с сайта sysinternals.com может помочь здесь.)
Это сообщение об ошибке действительно должен сказать что - то вроде «Покушение на совершение (размер запроса) будет превышать предел фиксации», и хотя это потребовало бы людей посмотреть, что «совершить предел» означает, что было бы гораздо более полезным. Что ж, это далеко не единственное, не столь полезное, как могло бы быть, сообщение об ошибке, которое есть в Windows - или в любой другой ОС, которую я когда-либо использовал. (Они могли бы по крайней мере поместить больше деталей в системный журнал событий!)
Обратите внимание: всякий раз, когда вы говорите о «памяти» в Windows, вы всегда должны определять ее - вы говорите о «виртуальной памяти» или «физической памяти»? Многие люди говорят «память», когда они могут иметь в виду либо. И многие люди говорят «RAM», когда действительно говорят о виртуальной памяти. Это только добавляет к путанице у всех.
Как я уже говорил ранее, то, что учитывается при фиксации, - это один тип виртуальной памяти. Предел фиксации - это максимальный объем виртуальной памяти того типа, который вы можете иметь. Вы можете увеличить лимит фиксации, добавив больше оперативной памяти и / или увеличив размер файла подкачки.
Но у меня много оперативной памяти!
Я не могу понять, почему мне нужно использовать виртуальную память с 12 ГБ ОЗУ.
Это совершенно понятный вопрос. И очень распространенный. И снова я обвиняю Microsoft в том, что она ничего не объясняет.
Вкратце: вам нужен файл подкачки, потому что ваша рабочая нагрузка пытается выделить больше «выделенного виртуального адресного пространства», чем у вас есть ОЗУ.
Во-первых, терминология: Windows всегда использует виртуальную память, независимо от того, есть ли у вас файл подкачки. Избавление от файла подкачки просто исключает подкачку на диск для выделенной виртуальной памяти; зафиксированный виртуальный компьютер все еще существует и все еще является виртуальным, во всех отношениях, за исключением возможности переноса на диск.
Но другой основной тип виртуальной памяти, вид, называемый «отображаемой памятью», продолжает работу на странице. Только не в файл подкачки.
Итак, что вы на самом деле спрашиваете: почему у вас заканчивается лимит коммитов, если у вас 12 ГБ ОЗУ?
Ну, это потому, что сколько бы вы ни использовали, плюс размер суммы, которую запрашивает какая-то программа, превысит ваш предел коммитов.
Вы можете увидеть это сообщение, даже если у вас достаточно оперативной памяти, как указано в диспетчере задач. И наоборот, вы можете не увидеть сообщение - т.е. попытка фиксации может быть успешной - даже если у вас мало «доступной» оперативной памяти. Потому что он не жалуется на доступную оперативную память. Он жалуется на отсутствие лимита коммитов.
Ваша программа может пытаться выделить огромное количество выделенной виртуальной памяти. Или у вас может быть запущено что-то еще, использующее коммит.
Теперь забавная вещь: когда процесс выделяет выделенную память, он фактически не использует оперативную память, равную выделенному количеству. Потому что это виртуально, помнишь? На самом деле для фиксации виртуальной памяти требуется очень мало ОЗУ, даже без файла подкачки. Это просто говорит, что «я» может «захотеть» использовать до «этой» много выделенной виртуальной памяти. Windows, можете ли вы пообещать («зафиксировать») мне, что это будет доступно, даже если я буду использовать все это? "
Только до тех пор, пока программа действительно не выполнит запись в эту выделенную память - получая доступ к ней и, таким образом, вызывая сбои страниц - ОЗУ фактически отключается от «доступного» счетчика и добавляется к «используемому». Это происходит постранично. Если вы записываете до 10 страниц (по 4 КБ каждая) в выделенном регионе, это будет использовать 10 страниц (40 КБ) оперативной памяти.
(Это может произойти, если вы тоже читаете с него, но не имеет смысла читать с недавно выделенной виртуальной памяти, прежде чем писать в нее.)
Очень часто программа никогда не получит доступ ко всем частным виртуальным машинам, которые она зафиксировала, и в этом случае используемая оперативная память не будет равняться сумме зафиксированного объема. (А в системе с файлом подкачки некоторые «зафиксированные» вещи могут быть перемещены в файл подкачки, чтобы освободить место в ОЗУ для других вещей ... еще больше сократив объем ОЗУ, используемый зафиксированным регионом.)
Но у Windows нет возможности узнать, сколько из выделенного региона будет использовано; при распределении у него нет другого выбора, кроме как предположить, что я «могу» фактически использовать все это. Это означает, что для хранения всего этого потребуется всего 1 ГБ фактического хранилища (возможно, некоторые из них находятся в файле подкачки, а остальные - в ОЗУ).
Таким образом, он не может удовлетворить этот запрос, если все текущие выделения «коммитов» вместе с новым не будут меньше предела коммитов.
Если бы он все равно удовлетворил запрос, то был бы риск фактического исчерпания ОЗУ, то есть невозможности устранить ошибку страницы из-за отсутствия ОЗУ. Это считается очень серьезной проблемой. И в ОС, и в программистах приложений намного проще установить ограничение, когда программа пытается зафиксировать виртуальную память.
Для получения дополнительной информации (как будто это уже не было достаточно долго)
Более подробно об этом, объясненном несколько другими способами, см. Два других моих ответа: здесь (дольше) используется аналогия «ссуды из банка», которую некоторые люди сочли эффективной. у этого (намного дольше) есть более формальное объяснение того, что происходит внутри ОС. Часто представление одной и той же концепции несколькими различными способами поможет вам преодолеть препятствие.
О файле подкачки против SSD
Это побочный вопрос, поэтому я перенес его сюда ...
все веб-страницы о явном SSD говорят отключить виртуальную память, чтобы избежать износа диска
Извините, но нет, не все так говорят, а те, которые делают, просто неправы. Современные твердотельные накопители будут обрабатывать петабайты записей перед тем, как начать показывать проблемы. А также из службы поддержки и вопросов и ответов для твердотельных накопителей (msdn) :
Нужно ли размещать файл подкачки на SSD?
Да. Большинство операций с файлами подкачки представляют собой небольшие случайные операции чтения или большие последовательные записи, которые являются типами операций, которые хорошо обрабатываются твердотельными накопителями.
Рассматривая данные телеметрии из тысяч трассировок и сосредотачиваясь на чтениях и записи файлов подкачки, мы находим, что
Pagefile.sys читает больше, чем pagefile.sys пишет примерно в 40 к 1,
Размер чтения Pagefile.sys обычно довольно мал: 67% меньше или равно 4 КБ и 88% меньше 16 КБ.
Записи Pagefile.sys относительно велики: 62% больше или равны 128 КБ, а 45% составляют ровно 1 МБ.
Фактически, учитывая типичные эталонные шаблоны файлов подкачки и благоприятные характеристики производительности, которые имеют SSD для этих шаблонов, существует немного файлов, которые лучше, чем файл подкачки, помещать на SSD.
Вот еще один удивительный факт: даже если вам может понадобиться файл подкачки, чтобы система могла удовлетворить эти запросы, на самом деле в файл подкачки может быть записано очень мало, может даже ничего! Опять же, это потому, что обычно существует большая разница между тем, сколько виртуальной памяти выделяется и сколько фактически используется. Под используемым мы подразумеваем «записано, и страницы ОЗУ назначены соответственно». В файл подкачки всегда попадет только частный коммит vm, которому фактически написано. Большинство современных систем (таких как ваша, с 12 ГБ ОЗУ) не очень часто пишут и читают файл подкачки. Тем не менее, файл подкачки часто необходим для успешного размещения виртуальных выделений. И, возможно, это заставит вас задуматься о том, чтобы поместить его на свой SSD.