Є два різних обмеження пам'яті. Ліміт віртуальної пам'яті та обмеження фізичної пам'яті.
Віртуальна пам'ять
Віртуальна пам'ять обмежена розміром та компонуванням наявного адресного простору. Зазвичай на самому початку є виконуваним кодом та статичними даними та минулим, що збільшує купу, а в кінці - область, зарезервована ядром, перед нею - спільні бібліотеки та стеки (що на більшості платформ зростає). Це дає купі та стеку вільний простір для зростання, інші області відомі при запуску та фіксації.
Вільна віртуальна пам'ять спочатку не позначається як придатна для використання, але вона позначається такою під час розподілу. Хоча купа може розростатися до всієї доступної пам'яті, більшість систем не розростає стеки автоматично. Ліміт IIRC для стека - 8MiB в Linux та 1MiB в Windows і може бути змінений в обох системах. Віртуальна пам'ять також містить будь-які файли та обладнання з картографічною пам'яттю.
Однією з причин того, що стек не може бути автоматично вирощений (довільно), є те, що багатопотокові програми потребують окремого стека для кожного потоку, щоб вони врешті-решт потрапляли один у одного.
На 32-бітних платформах загальний обсяг віртуальної пам’яті становить 4GiB, і Linux, і Windows зазвичай резервують останній 1GiB для ядра, що дає вам максимум 3GiB адресного простору. Існує спеціальна версія Linux, яка не резервує нічого, даючи вам повний 4GiB. Це корисно для рідкісних випадків великих баз даних, де останній 1GiB економить день, але для регулярного використання він трохи повільніше через додаткові перезавантаження таблиць сторінок.
На 64-бітних платформах віртуальна пам'ять становить 64EiB, і вам не доведеться думати про це.
Фізична пам'ять
Фізична пам'ять зазвичай виділяється операційною системою лише тоді, коли процес потребує доступу до неї. Скільки фізичної пам’яті використовує процес - це дуже нечітке число, оскільки деяка пам’ять поділяється між процесами (код, спільні бібліотеки та будь-які інші відображені файли), дані з файлів завантажуються в пам'ять на вимогу та викидаються, коли є дефіцит пам’яті та "анонімна" пам'ять (та, яка не підтримується файлами) може бути замінена.
В Linux те, що станеться, коли у вас не вистачає фізичної пам'яті, залежить від vm.overcommit_memory
налаштування системи. За замовчуванням - перевиконання. Коли ви просите систему виділити пам'ять, вона дає вам деякі, а лише виділяє віртуальну пам'ять. Коли ви фактично отримуєте доступ до пам'яті, вона намагатиметься використовувати фізичну пам'ять, відкидаючи дані, які можна перечитати або замінити речі за необхідності. Якщо він виявить, що нічого не може звільнити, він просто видалить процес із існування (немає ніякого способу реагувати, оскільки ця реакція може зажадати більше пам'яті, а це призведе до нескінченного циклу).
Так вмирають процеси на Android (що також є Linux). Логіка була вдосконалена логікою, який процес видалити з існування, виходячи з того, що цей процес робить і скільки йому років. Тоді андроїдні процеси просто перестають робити що завгодно, але сидіти на задньому плані, і "вбивця пам'яті" вб'є їх, коли йому потрібна пам'ять для нових.