Il existe deux limites de mémoire différentes. La limite de mémoire virtuelle et la limite de mémoire physique.
Mémoire virtuelle
La mémoire virtuelle est limitée par la taille et la disposition de l'espace d'adressage disponible. Habituellement, au tout début se trouve le code exécutable et les données statiques et le passé qui font croître le tas, tandis qu'à la fin, la zone est réservée par le noyau, avant les bibliothèques partagées et la pile (qui, sur la plupart des plates-formes, croît). Cela donne un espace libre au tas et à la pile pour grandir, les autres zones étant connues au démarrage du processus et corrigées.
La mémoire virtuelle libre n'est pas initialement marquée comme utilisable, mais est marquée comme telle lors de l'allocation. Bien que le tas puisse atteindre toute la mémoire disponible, la plupart des systèmes n'augmentent pas automatiquement les piles. La limite par défaut de l'IIRC pour la pile est de 8 Mo sous Linux et de 1 Mo sous Windows et peut être modifiée sur les deux systèmes. La mémoire virtuelle contient également des fichiers et du matériel mappés en mémoire.
L'une des raisons pour lesquelles la pile ne peut pas être développée automatiquement (arbitrairement) est que les programmes multithread ont besoin d'une pile distincte pour chaque thread, afin qu'ils finissent par se gêner mutuellement.
Sur les plates-formes 32 bits, la quantité totale de mémoire virtuelle est de 4 Go, Linux et Windows réservant normalement le dernier 1 Go pour le noyau, vous offrant au maximum 3 Go d'espace d'adressage. Il existe une version spéciale de Linux qui ne réserve rien pour vous donner une 4GiB complète. Il est utile pour les rares cas de grandes bases de données où le dernier 1 Go enregistre la journée, mais pour une utilisation régulière, il est légèrement plus lent en raison des rechargements de table de pages supplémentaires.
Sur les plates-formes 64 bits, la mémoire virtuelle est 64EiB et vous n'avez pas à y penser.
Mémoire physique
La mémoire physique n'est généralement allouée par le système d'exploitation que lorsque le processus doit y accéder. La quantité de mémoire physique utilisée par un processus est un nombre très flou, car une partie de la mémoire est partagée entre les processus (le code, les bibliothèques partagées et tout autre fichier mappé), les données des fichiers sont chargées en mémoire à la demande et supprimées en cas de manque de mémoire et La mémoire "anonyme" (celle qui n'est pas sauvegardée par des fichiers) peut être permutée.
Sous Linux, ce qui se produit lorsque vous manquez de mémoire physique dépend du vm.overcommit_memory
paramètre système. La valeur par défaut est de sur-engager. Lorsque vous demandez au système d'allouer de la mémoire, il vous en donne, mais alloue uniquement la mémoire virtuelle. Lorsque vous accédez réellement à la mémoire, il essaie d'obtenir de la mémoire physique à utiliser, en supprimant les données qui peuvent être relues ou en échangeant des éléments si nécessaire. S'il trouve qu'il ne peut rien libérer, il supprimera simplement le processus de l'existence (il n'y a aucun moyen de réagir, car cette réaction pourrait nécessiter plus de mémoire et cela conduirait à une boucle sans fin).
C'est ainsi que les processus meurent sur Android (qui est aussi Linux). La logique a été améliorée avec la logique qui traite de supprimer de l' existence en fonction de ce processus fait et quel âge il est. Les processus Android cessent simplement de faire quoi que ce soit, mais restent en arrière-plan et le "tueur de mémoire" les tuera lorsqu'il aura besoin de mémoire pour de nouveaux.