У меня есть процесс, который сообщает «сверху», что он имеет 6 ГБ резидентной памяти и 70 ГБ выделенной виртуальной памяти. Странно то, что этот конкретный сервер имеет только 8 ГБ физического и 35 ГБ свободного пространства подкачки.
Из «верхнего» руководства:
o: VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It includes
all code, data and shared libraries plus pages that have been
swapped out. (Note: you can define the STATSIZE=1 environment vari-
able and the VIRT will be calculated from the /proc/#/state VmSize
field.)
VIRT = SWAP + RES.
Учитывая это объяснение, я ожидаю, что распределение виртуальной памяти для процесса будет ограничено моей доступной подкачкой + физической памятью.
Согласно 'pmap', разделы кода, разделяемой библиотеки и разделяемой памяти этого процесса минимальны - не более 300 МБ или около того.
Очевидно, что машина и процесс все еще работают правильно (хотя и медленно), так чего мне здесь не хватает?
источник
Вот обсуждение вирт против резидентной памяти:
/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used
Обсуждение относится к процессам Java, но применимо ко всему, что работает под Linux. Главное, что касается вирта, это то, что он включает в себя целую кучу вещей, которые никогда не могут быть использованы. Virt - это то, на что нужно обратить внимание в 32-битных ОС (поскольку процессы будут выходить за пределы адресуемого пространства), но в большинстве случаев это бесполезно. Как уже отмечалось, следует обратить внимание на резидентную память, которая будет ограничена доступной физической оперативной памятью и вашей подкачкой.
источник
Вероятно, это связано с тем, что адресное пространство процесса соответствует размеру, который вы указали, но на самом деле оно не выделяется ОС.
От: http://lwn.net/Articles/428100/
Так что это нелегкий способ управления памятью иногда - наличие непрерывного адресного пространства упрощает освобождение неиспользуемой памяти.
источник
Ответ, вероятно, MMAP - данные находятся на диске, но они находятся «вне» подкачки и не могут быть видны с помощью команды «free» или «top».
Если процесс Java не слишком сложен, вы можете попробовать поиграть с «lsof», чтобы найти файл MMAP. Однако, если этот Java-процесс сложен, его будет трудно увидеть.
источник
Я также был удивлен, что Linux позволяет выделить больше виртуальной памяти, чем физической памяти + пространство подкачки, но, очевидно, это помогает повысить производительность в типичных ситуациях.
http://www.linuxjournal.com/article/10678
источник