2つの異なるメモリ制限があります。仮想メモリの制限と物理メモリの制限。
仮想メモリ
仮想メモリは、使用可能なアドレス空間のサイズとレイアウトによって制限されます。通常、最初は実行可能コードと静的データであり、過去はヒープを拡大しますが、最後はカーネルによって予約された領域であり、共有ライブラリとスタック(ほとんどのプラットフォームで縮小します)の前です。これにより、ヒープとスタックの空き領域が増加し、他の領域はプロセスの起動時に認識され、修正されます。
空き仮想メモリは、最初は使用可能としてマークされていませんが、割り当て時にそのようにマークされます。ヒープは利用可能なすべてのメモリまで拡大できますが、ほとんどのシステムはスタックを自動成長しません。スタックのIIRCのデフォルト制限は、Linuxでは8MiB、Windowsでは1MiBであり、両方のシステムで変更できます。仮想メモリには、メモリマップされたファイルとハードウェアも含まれます。
スタックを(任意に)自動成長できない理由の1つは、マルチスレッドプログラムがスレッドごとに個別のスタックを必要とするため、最終的にはお互いの邪魔になることです。
32ビットプラットフォームでは、仮想メモリの合計量は4GiBであり、LinuxとWindowsの両方が通常カーネル用に最後の1GiBを予約し、最大3GiBのアドレススペースを提供します。完全な4GiBを提供する何も予約しない特別なバージョンのLinuxがあります。これは、最後の1GiBが1日を節約する大規模なデータベースのまれなケースには役立ちますが、通常の使用では追加のページテーブルのリロードのために若干遅くなります。
64ビットプラットフォームでは、仮想メモリは64EiBであり、それについて考える必要はありません。
物理メモリ
物理メモリは通常、プロセスがアクセスする必要があるときにのみオペレーティングシステムによって割り当てられます。プロセスが使用している物理メモリの量は非常に曖昧な数値です。一部のメモリはプロセス間で共有されているため(コード、共有ライブラリ、およびその他のマップされたファイル)、ファイルのデータはオンデマンドでメモリに読み込まれ、メモリ不足が発生すると破棄されます「匿名」メモリ(ファイルに裏付けされていないメモリ)は交換される場合があります。
Linuxでは、物理メモリが不足したときに何が起こるかは、vm.overcommit_memory
システム設定によって異なります。デフォルトはオーバーコミットです。システムにメモリを割り当てるように依頼すると、メモリが割り当てられますが、仮想メモリのみが割り当てられます。実際にメモリにアクセスすると、使用する物理メモリを取得しようとし、再読み取り可能なデータを破棄したり、必要に応じて物を交換したりします。何も解放できないと判断した場合、プロセスを存在から単純に削除します(反応する方法がありません。反応により多くのメモリが必要になり、無限ループが発生する可能性があるためです)。
これは、Android(これもLinux)でプロセスが死ぬ方法です。ロジックはロジックで改善されたプロセスが何をしているかに基づいて、存在から削除する処理とどのように古いことがあります。アンドロイドのプロセスは単に何もするのを止めますが、バックグラウンドに座っていると、「メモリ不足のキラー」が新しいプロセスにメモリを必要とするときにそれらを殺します。