В типичной виртуальной машине много накладных расходов, которые не учитываются в учете виртуальных машин, потому что она, по сути, украдена собственными элементами процесса - например, Отображение в .so файлах, которые используются для выполнения кода собственного уровня для системных библиотек, не учитывается в учете базовой ВМ. Ваша типичная разделяемая библиотека отображается в верхнем ГБ памяти, поэтому, если вы попытаетесь выделить память в эту область, вам будет отказано, поскольку она будет переполнена областью памяти разделяемых библиотек - выделение памяти в большинстве ОС выполняется простой бар, который поднимается, когда вы просите больше памяти. Когда вы запрашиваете память и столбец конфликтует с другими видами использования, он просто не работает. Большая часть следующих подробностей относится к этому.
Вы должны избегать необходимости в большом количестве памяти в 32-битном процессе. Это фундаментальная проблема. Получить 64-битную виртуальную машину, которая позволит вам использовать гораздо больше памяти, чем было бы в противном случае, - тривиально. В этой ситуации ее просто можно использовать.
Если вы используете 32-битный процесс, существует высокая вероятность того, что вы столкнулись с пределом эффективного адресного пространства 32-битного процесса. Для окон это максимум около 3 ГБ - все, что выше, зарезервировано для пространства ввода-вывода и ядра. Вы можете переместить это, но он имеет тенденцию ломать приложения / драйверы, предназначенные для 32-битной ОС.
В Linux у вас получается ~ 3 ГБ доступной адресуемой оперативной памяти на процесс, остальное используется такими вещами, как ядро, и отображается в общих библиотеках. Этот предел называется «пределом адресного пространства», и я предполагаю, что его можно настроить.
Как этого избежать? Ну, по большей части, вы не можете, это физическое ограничение 32-битного адресного пространства и необходимость наличия ядра / ввода-вывода в том же адресном пространстве, что и процесс для 32-битной ОС.
С 64-битными ОС у вас есть (большая часть) все 64-битное адресное пространство, с которым можно поиграться, что значительно больше, чем нужно.