Istnieją dwa różne limity pamięci. Limit pamięci wirtualnej i limit pamięci fizycznej.
Pamięć wirtualna
Pamięć wirtualna jest ograniczona rozmiarem i układem dostępnej przestrzeni adresowej. Zwykle na samym początku kod wykonywalny oraz dane statyczne i przeszłość powiększają stertę, podczas gdy na końcu jest obszar zarezerwowany przez jądro, zanim udostępnione biblioteki i stos (które na większości platform rosną). Daje to wolną przestrzeń na stosy i stosy, a inne obszary są znane podczas uruchamiania procesu i naprawione.
Wolna pamięć wirtualna nie jest początkowo oznaczana jako użyteczna, ale jest oznaczana podczas przydzielania. Podczas gdy sterty mogą rosnąć do całej dostępnej pamięci, większość systemów nie powiększa automatycznie stosów. Domyślny limit IIRC dla stosu wynosi 8 MB w systemie Linux i 1 MB w systemie Windows i można go zmienić w obu systemach. Pamięć wirtualna zawiera także pliki i sprzęt mapowane w pamięci.
Jednym z powodów, dla których stos nie może być automatycznie rozwijany (arbitralnie), jest to, że programy wielowątkowe potrzebują osobnego stosu dla każdego wątku, aby w końcu mogły sobie wzajemnie przeszkodzić.
Na platformach 32-bitowych całkowita ilość pamięci wirtualnej wynosi 4GiB, zarówno Linux, jak i Windows zwykle rezerwują ostatnie 1GiB dla jądra, co daje maksymalnie 3GiB przestrzeni adresowej. Istnieje specjalna wersja systemu Linux, która nie rezerwuje niczego, co daje pełne 4GiB. Jest przydatny w rzadkich przypadkach dużych baz danych, w których ostatni 1GiB oszczędza dzień, ale przy regularnym użyciu jest nieco wolniejszy z powodu dodatkowych przeładowań tabeli stron.
Na platformach 64-bitowych pamięć wirtualna to 64EiB i nie musisz o tym myśleć.
Pamięć fizyczna
Pamięć fizyczna jest zwykle przydzielana przez system operacyjny tylko wtedy, gdy proces potrzebuje do niej dostępu. Ilość pamięci fizycznej wykorzystywanej przez proces jest bardzo rozmyta, ponieważ część pamięci jest dzielona między procesami (kod, biblioteki współdzielone i wszelkie inne mapowane pliki), dane z plików są ładowane do pamięci na żądanie i usuwane, gdy brakuje pamięci i Pamięć „anonimowa” (pamięć nieopartą na plikach) może zostać zamieniona.
W systemie Linux, co się stanie, gdy zabraknie pamięci fizycznej, zależy od vm.overcommit_memory
ustawień systemowych. Domyślnie jest to zbyt duże. Gdy poprosisz system o alokację pamięci, daje ci trochę, ale tylko alokuje pamięć wirtualną. Gdy faktycznie uzyskasz dostęp do pamięci, spróbuje ona użyć pewnej pamięci fizycznej, odrzucając dane, które można ponownie odczytać, lub w razie potrzeby wymieniając różne rzeczy. Jeśli stwierdzi, że nic nie może uwolnić, po prostu usunie proces z istnienia (nie ma sposobu, aby zareagować, ponieważ reakcja ta może wymagać więcej pamięci, co doprowadziłoby do nieskończonej pętli).
W ten sposób umierają procesy na Androidzie (którym jest także Linux). Logika została ulepszona o logikę, którą proces usunąć z istnienia na podstawie tego, co robi proces i ile ma lat. Procesy Androida po prostu przestają cokolwiek robić, ale siedzą w tle, a „zabójca pamięci” zabije je, gdy będzie potrzebował pamięci na nowe.