Question

Mon application est similaire à un programme hypotétique:

for(;;) {
  for (i=0; i<1000; i++) {
    p[i] = malloc(random_number_between_1000_and_100000());
    p[i][0]=0;  // update
   }
  for (i=0; i<1000; i++) {
    free(p[i]);
  }
}

N'a pas de fuite de mémoire, mais sur mon système, la consommation de mémoire (en haut, colonne VSS) augmente sans limite (jusqu'à 300% de la mémoire physique disponible). Est-ce normal?

Mis à jour : utilisez la mémoire pendant un moment, puis libérez-la. Est-ce une différence?

Était-ce utile?

La solution

Essayez d'ajouter

  sbrk(-1);

à la fin de chaque boucle pour voir si cela fait une différence.

free () ne libère que la mémoire, mais ne la restitue pas au système d'exploitation.

Autres conseils

Le comportement est normal. Citant man 3 malloc :

BOGUES

Par défaut, Linux applique une stratégie d’allocation de mémoire optimiste. Cela signifie que lorsque malloc () renvoie non-NULL, il n’ya aucune garantie que le        la mémoire est vraiment disponible. C'est un très mauvais bug. S'il s'avère que le système manque de mémoire, un ou plusieurs processus seront exécutés.        tué par l'infâme tueur de MOO. Dans le cas où Linux est utilisé dans des circonstances où il serait moins souhaitable de perdre soudainement un peu        processus sélectionnés et, de plus, la version du noyau est suffisamment récente, vous pouvez désactiver ce comportement de surconsommation à l’aide d’une commande telle que:

       # echo 2 > /proc/sys/vm/overcommit_memory

Voir aussi le répertoire de documentation du noyau, les fichiers vm / oversommit-accounting et sysctl / vm.txt.

Vous devez toucher (lire / écrire) la mémoire du noyau Linux pour la réserver.

Le système d'exploitation alloue généralement toutes les pages en tant que clones Copy-On-Write du fichier "0". page, qui est une page fixe remplie de zéros. Lecture des pages retournera 0 comme prévu. Tant que vous ne lisez que, toutes les références vont la même mémoire physique. Une fois que vous avez écrit une valeur, la & C; COW " est brisé et un véritable cadre physique est attribué à vous. Ce signifie que tant que vous n'écrivez pas dans la mémoire, vous pouvez continuer allouer de la mémoire jusqu'à épuisement de l'espace d'adressage de la mémoire virtuelle ou votre table de pages remplit toute la mémoire disponible.

Tant que vous ne touchez pas ces morceaux alloués, le système ne les attribuera pas vraiment pour vous.
Cependant, vous pouvez manquer d’espace adressable, ce qui est une limite imposée par le système d’exploitation aux processus, et qui n’est pas nécessairement le maximum que vous pouvez utiliser avec le type de pointeur système.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top