Относится ли неактивная память к выделенной, но неиспользуемой?

Относится ли неактивная память к выделенной, но неиспользуемой?

Отдокументация Linux procfs:

      Active: Memory that has been used more recently and usually not reclaimed unless
              absolutely necessary.
    Inactive: Memory which has been less recently used. It is more eligible to be
              reclaimed for other purposes
Committed_AS: The amount of memory presently allocated on the system. The committed 
              memory is a sum of all of the memory which has been allocated by 
              processes, even if it has not been "used" by them as of yet. (...)

Мой вопрос касается памяти Committed_AS и ее части, которая фактически используется/не используется. Я понимаю, что активная память — это часть выделенной памяти, которая фактически используется. Однако я не знаю, что происходит с неактивной памятью; включает ли она также выделенную, но неиспользуемую память, помимо памяти, которая недавно не использовалась?

решение1

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

Выделенная память — это сумма всего пространства, которое номинально было выделено процессам. Это совокупность всего пространства памяти, которое процессы считают доступным, включая активное (в ОЗУ и недавно использованное), неактивное (в ОЗУ и использованное в какой-то момент, но подлежащее подкачке, поскольку его использование не было недавним), выгруженное (когда-то в ОЗУ и использованное, с тех пор выгруженное для подкачки) и никогда не использованное (пространство, возвращенное malloc(), но еще не использованное)

решение2

См. man proc; цитирую напрямую:

Процесс, который выделяет 1 ГБ памяти (используя malloc(3) или подобный), но затрагивает только 300 МБ этой памяти, будет отображаться как использующий только 300 МБ памяти, даже если у него есть адресное пространство, выделенное для всего 1 ГБ. Этот 1 ГБ — это память, которая была «зарезервирована» виртуальной машиной и может быть использована в любое время выделяющим приложением.

Committed_ASотносится к общему объему памяти, запрошенной в системе для динамического выделения памяти; это означало бы, что неактивная память (которая не находится в куче) не учитывается. Вот где проявляется сила виртуальной памяти; процесс «думает», что у него есть вся запрошенная им память, но на самом деле у него есть только то, что ему нужно.

Это также напрямую связано сovercommit_memory sysctlпараметр конфигурации, который можно использовать для предотвращения «чрезмерного выделения» памяти, чтобы сервер неООМсебя, если ему когда-либо понадобится вся «выделенная» память сразу.

Связанный контент