Хочется наиболее полно задать вопрос, но буду нудно подходить с нескольких сторон.
1. Есть такая история, когда вы можете выделить памяти больше, чем вообще RAM. Свопа нет. То есть, как-то можно память так выделить, что система позволит застолбить больше, чем RAM, но что будет когда вы попытаетесь использовать всё выделенное я незнаю.
2. Есть ещё такая штука, как /proc/sys/vm/overcommit_memory - но допустим она равна 0, как по-умолчанию.
3. У меня была ситуация. Тут ещё надо сделать скидку, что я не представляю подробно, как себя ведёт то, что я тут буду упоминать. Я запускал несколько процессов java с ключом -Xmx1000M. Таких процессов запускал штук 5 на машине с 2 GB RAM и они успешно работали. Мне сказали, правда до меня не очень дошло (постижение природы этого явления и есть смысл этого поста), что java как-то так выделяет этот гиг памяти, что пять таких процессов прекрасно работают на 2GB RAM.
Ситуация в том, что мне дали OpenVZ - виртуалку (VPS), память = 3.5GB, свопа нет. Я обломался запустить там 5 процессов java -Xmx1000M. Ява говорила, что не может инициализировать VM. Или в некоторых местах падала, не могла выделить память. Или вела себя странно (странность в том, что не могла вызвать fork, чтобы выполнить команду «chmod», например, причина - памяти не хватало (ловятся исключения, в исключении говорится «cannot allocate memory»). Ok, сорри за лишни детали.
И вот объяснение одного человека, которое до меня не дошло:
OpenVZ allows you to limit 6 different «kinds» of memory:
lockedpages
privvmpages
shmpages
physpages
vmguarpages
oomguarpages
What exactly to do limit? «privvmpages»? Have you checked OpenVZ bean
counters for processes hitting the limit in your VPSes?
Generally, if we won't go into the details, OpenVZ «privvmpages» and
having X megabytes of physical RAM in physical system is two very
different things. If you use «privvmpages», you effectively limit the
available address space of all processes inside VPS that they can
_allocate_. Java applications are fairly sensitive to this - if, for
example, you will run Java machines with -Xmx1024M in your «2.5GB RAM»
VPS, and it's really «2.5GB worth of privvmpages», you'd likely would
be able to run only 2 jvms: third one would fail mysteriously by
hitting the limit.
Я не понял смысла здесь: If you use «privvmpages», you effectively limit the
available address space of all processes inside VPS that they can
_allocate_. (Если у тебя «privvmpages», то для всех процессов в твоей VPS ты обрезаешь адресное пространство, которое они могут выделять).
У меня не вяжется «пространство» и «выделять», ибо когда я выделяю память, я ничего не говорю о месте в пространстве, где я хочу выделить память, я сообщаю только количество байт.
Не дошло, короче. То есть, диагноз я понял - не взлетит, но механизм взлетания и невзлетани хотелось-бы понять.
Спасибо.