Es gibt zwei verschiedene Speichergrenzen. Das virtuelle Speicherlimit und das physische Speicherlimit.
Virtueller Speicher
Der virtuelle Speicher ist durch die Größe und das Layout des verfügbaren Adressraums begrenzt. Ganz am Anfang stehen in der Regel der ausführbare Code und die statischen Daten sowie die Vergangenheit, die den Heap vergrößern, während am Ende der vom Kernel reservierte Bereich vor den gemeinsam genutzten Bibliotheken und dem Stack (der auf den meisten Plattformen kleiner wird) angezeigt wird. Dies gibt Heap- und Stack-freiem Speicherplatz zum Wachsen. Die anderen Bereiche sind beim Start des Prozesses bekannt und wurden behoben.
Der freie virtuelle Speicher wird anfangs nicht als nutzbar markiert, sondern bei der Zuweisung als nutzbar markiert. Während der Heap-Speicher auf den gesamten verfügbaren Arbeitsspeicher anwachsen kann, werden Stapel auf den meisten Systemen nicht automatisch vergrößert. Das IIRC-Standardlimit für den Stapel beträgt 8 MB unter Linux und 1 MB unter Windows und kann auf beiden Systemen geändert werden. Der virtuelle Speicher enthält auch alle Speicherzuordnungsdateien und -hardware.
Ein Grund, warum Stapel nicht automatisch (willkürlich) aufgebaut werden können, ist, dass Multithread-Programme für jeden Thread einen separaten Stapel benötigen, damit sie sich gegenseitig im Weg stehen.
Auf 32-Bit-Plattformen beträgt der gesamte virtuelle Speicher 4 GB, wobei Linux und Windows normalerweise die letzten 1 GB für den Kernel reservieren, sodass Sie höchstens 3 GB Adressraum haben. Es gibt eine spezielle Linux-Version, die nichts reserviert, was Ihnen volle 4GiB bietet. Dies ist nützlich für den seltenen Fall großer Datenbanken, in denen das letzte 1GiB den Tag speichert. Bei regelmäßiger Verwendung ist es jedoch etwas langsamer, da zusätzliche Seitentabellen neu geladen werden.
Auf 64-Bit-Plattformen beträgt der virtuelle Speicher 64EiB, und Sie müssen nicht darüber nachdenken.
Physikalischer Speicher
Der physische Speicher wird normalerweise nur vom Betriebssystem zugewiesen, wenn der Prozess darauf zugreifen muss. Wie viel physischen Speicher ein Prozess verwendet, ist eine sehr unscharfe Zahl, da ein Teil des Arbeitsspeichers von Prozessen gemeinsam genutzt wird (der Code, gemeinsam genutzte Bibliotheken und andere zugeordnete Dateien). Daten aus Dateien werden bei Bedarf in den Arbeitsspeicher geladen und verworfen, wenn nicht genügend Arbeitsspeicher vorhanden ist Möglicherweise wird der "anonyme" Speicher (der Speicher, der nicht durch Dateien gesichert ist) ausgetauscht.
Was unter Linux passiert, wenn der physische Speicher voll ist, hängt von der vm.overcommit_memory
Systemeinstellung ab. Standardmäßig wird ein Overcommit durchgeführt. Wenn Sie das System auffordern, Speicher zuzuweisen, werden Ihnen einige zugewiesen, jedoch nur der virtuelle Speicher. Wenn Sie tatsächlich auf den Speicher zugreifen, wird versucht, physischen Speicher zu verwenden. Dabei werden Daten verworfen, die neu gelesen oder bei Bedarf ausgetauscht werden können. Wenn es feststellt, dass es nichts freisetzen kann, wird es einfach den Prozess aus der Existenz entfernen (es gibt keine Möglichkeit zu reagieren, da diese Reaktion mehr Speicher erfordern könnte und dies zu einer Endlosschleife führen würde).
So sterben Prozesse auf Android (das ist auch Linux). Die Logik wurde durch die Logik verbessert, welcher Prozess aus der Existenz entfernt werden soll, basierend darauf, was der Prozess tut und wie alt er ist. Dann hören Android-Prozesse einfach auf, etwas zu tun, sitzen aber im Hintergrund und der "Out-of-Memory-Killer" wird sie töten, wenn Speicher für neue benötigt wird.