Ada dua batas memori yang berbeda. Batas memori virtual dan batas memori fisik.
Memori Virtual
Memori virtual dibatasi oleh ukuran dan tata letak ruang alamat yang tersedia. Biasanya pada awalnya adalah kode yang dapat dieksekusi dan data statis dan masa lalu yang menumpuk heap, sementara pada akhirnya adalah area yang dicadangkan oleh kernel, sebelum itu shared library dan stack (yang pada kebanyakan platform tumbuh ke bawah). Itu memberi heap dan stack ruang kosong untuk tumbuh, area lainnya dikenal saat proses startup dan diperbaiki.
Memori virtual bebas pada awalnya tidak ditandai sebagai dapat digunakan, tetapi ditandai seperti itu selama alokasi. Meskipun tumpukan dapat tumbuh ke semua memori yang tersedia, sebagian besar sistem tidak menumbuhkan tumpukan secara otomatis. Batas standar IIRC untuk stack adalah 8MiB di Linux dan 1MiB di Windows dan dapat diubah di kedua sistem. Memori virtual juga berisi file dan perangkat keras yang dipetakan memori.
Salah satu alasan mengapa stack tidak dapat dikembangkan secara otomatis (sewenang-wenang) adalah bahwa program multi-threaded membutuhkan stack yang terpisah untuk setiap utas, sehingga pada akhirnya mereka akan saling menghalangi.
Pada platform 32-bit, jumlah total memori virtual adalah 4GiB, baik Linux maupun Windows biasanya memesan 1GiB terakhir untuk kernel, memberikan Anda ruang alamat 3GiB paling banyak. Ada versi khusus Linux yang tidak memesan apa pun yang memberi Anda 4GiB penuh. Ini berguna untuk kasus yang jarang dari database besar di mana 1GiB terakhir menghemat hari, tetapi untuk penggunaan reguler sedikit lebih lambat karena reload tabel tabel tambahan.
Pada platform 64-bit memori virtual adalah 64EiB dan Anda tidak perlu memikirkannya.
Ingatan fisik
Memori fisik biasanya hanya dialokasikan oleh sistem operasi ketika proses perlu mengaksesnya. Berapa banyak memori fisik yang digunakan suatu proses adalah angka yang sangat kabur, karena sebagian memori dibagi antara proses (kode, pustaka bersama, dan file yang dipetakan lainnya), data dari file dimuat ke dalam memori sesuai permintaan dan dibuang ketika ada kekurangan memori dan Memori "anonim" (memori yang tidak didukung oleh file) dapat ditukar.
Di Linux apa yang terjadi ketika Anda kehabisan memori fisik tergantung pada vm.overcommit_memory
pengaturan sistem. Defaultnya adalah overcommit. Ketika Anda meminta sistem untuk mengalokasikan memori, itu memberikan beberapa kepada Anda, tetapi hanya mengalokasikan memori virtual. Ketika Anda benar-benar mengakses memori, itu akan mencoba untuk mendapatkan beberapa memori fisik untuk digunakan, membuang data yang dapat dibaca ulang atau menukar hal-hal yang diperlukan. Jika ternyata tidak bisa membebaskan apa pun, itu hanya akan menghapus proses dari keberadaan (tidak ada cara untuk bereaksi, karena reaksi itu bisa memerlukan lebih banyak memori dan itu akan menyebabkan loop tanpa akhir).
Ini adalah bagaimana proses mati di Android (yang juga Linux). Logika ditingkatkan dengan logika proses mana untuk menghapus dari keberadaan berdasarkan pada apa proses itu lakukan dan berapa umurnya. Daripada proses android hanya berhenti melakukan apa pun, tetapi duduk di latar belakang dan "out of memory killer" akan membunuh mereka ketika membutuhkan memori untuk yang baru.