Có hai giới hạn bộ nhớ khác nhau. Giới hạn bộ nhớ ảo và giới hạn bộ nhớ vật lý.
Bộ nhớ ảo
Bộ nhớ ảo bị giới hạn bởi kích thước và bố cục không gian địa chỉ có sẵn. Thông thường ngay từ đầu là mã thực thi và dữ liệu tĩnh và quá khứ phát triển heap, trong khi ở cuối là vùng dành riêng cho kernel, trước đó là các thư viện và ngăn xếp được chia sẻ (trên hầu hết các nền tảng phát triển xuống). Điều đó mang lại cho đống và không gian trống để phát triển, các khu vực khác được biết đến khi khởi động quá trình và cố định.
Bộ nhớ ảo miễn phí ban đầu không được đánh dấu là có thể sử dụng được, nhưng được đánh dấu như vậy trong quá trình phân bổ. Mặc dù heap có thể phát triển đến tất cả bộ nhớ khả dụng, hầu hết các hệ thống không tự động phát triển ngăn xếp. Giới hạn mặc định của IIRC cho ngăn xếp là 8MiB trên Linux và 1MiB trên Windows và có thể được thay đổi trên cả hai hệ thống. Bộ nhớ ảo cũng chứa bất kỳ tệp và phần cứng ánh xạ bộ nhớ.
Một lý do tại sao ngăn xếp không thể được tự động phát triển (một cách tùy tiện) là các chương trình đa luồng cần ngăn xếp riêng cho từng luồng, do đó cuối cùng chúng sẽ gặp nhau.
Trên nền tảng 32 bit, tổng dung lượng bộ nhớ ảo là 4GiB, cả Linux và Windows thường dự trữ 1GiB cuối cùng cho kernel, cung cấp cho bạn tối đa 3GiB không gian địa chỉ. Có một phiên bản Linux đặc biệt không bảo lưu bất cứ thứ gì cung cấp cho bạn 4GiB đầy đủ. Nó rất hữu ích cho trường hợp hiếm hoi của cơ sở dữ liệu lớn trong đó 1GiB cuối cùng tiết kiệm trong ngày, nhưng để sử dụng thường xuyên, nó sẽ chậm hơn một chút do tải lại bảng trang bổ sung.
Trên nền tảng 64 bit, bộ nhớ ảo là 64EiB và bạn không phải suy nghĩ về nó.
Bộ nhớ vật lý
Bộ nhớ vật lý thường chỉ được phân bổ bởi hệ điều hành khi quá trình cần truy cập. Số lượng bộ nhớ vật lý mà một quá trình đang sử dụng là số rất mờ, vì một số bộ nhớ được chia sẻ giữa các quy trình (mã, thư viện dùng chung và bất kỳ tệp ánh xạ nào khác), dữ liệu từ các tệp được tải vào bộ nhớ theo yêu cầu và bị loại bỏ khi thiếu bộ nhớ và Bộ nhớ "ẩn danh" (bộ nhớ không được hỗ trợ bởi các tệp) có thể được hoán đổi.
Trên Linux, điều gì xảy ra khi bạn hết bộ nhớ vật lý phụ thuộc vào vm.overcommit_memory
cài đặt hệ thống. Mặc định là overcommit. Khi bạn yêu cầu hệ thống phân bổ bộ nhớ, nó sẽ cung cấp một số cho bạn, nhưng chỉ phân bổ bộ nhớ ảo. Khi bạn thực sự truy cập vào bộ nhớ, nó sẽ cố gắng lấy một số bộ nhớ vật lý để sử dụng, loại bỏ dữ liệu có thể đọc lại hoặc hoán đổi mọi thứ khi cần thiết. Nếu nó thấy nó không thể giải phóng bất cứ thứ gì, nó sẽ đơn giản loại bỏ quá trình khỏi sự tồn tại (không có cách nào để phản ứng, bởi vì phản ứng đó có thể cần nhiều bộ nhớ hơn và điều đó sẽ dẫn đến vòng lặp vô tận).
Đây là cách các tiến trình chết trên Android (cũng là Linux). Logic được cải thiện với logic mà quá trình loại bỏ khỏi sự tồn tại dựa trên những gì quá trình đang làm và bao nhiêu tuổi. Hơn các quy trình Android chỉ đơn giản là ngừng làm bất cứ điều gì, nhưng ngồi trong nền và "kẻ giết người hết bộ nhớ" sẽ giết chúng khi nó cần bộ nhớ cho những cái mới.