Quand je lance le code suivant, il mange lentement ma mémoire et commence même en utilisant swap:Comment NSMutableData alloue-t-il de la mémoire?
long long length = 1024ull * 1024ull * 1024ull * 2ull; // 2 GB
db = [NSMutableData dataWithLength:length];
char *array = [db mutableBytes];
for(long long i = 0; i < length - 1; i++) {
array[i] = i % 256;
}
Si je le lance sans pour le cycle sans mémoire est utilisée à tous:
long long length = 1024ull * 1024ull * 1024ull * 2ull;
db = [NSMutableData dataWithLength:length];
char *array = [db mutableBytes];
/* for(long long i = 0; i < length - 1; i++) {
array[i] = i % 256;
} */
Je peux seulement conclure que NSMutableData ne fait que "réserver" de la mémoire et quand on y accède, il l'"alloue" vraiment. Comment est-ce fait exactement?
Est-ce fait via le matériel (CPU)?
Existe-t-il un moyen pour NSMutableData d'intercepter les écritures de la mémoire dans sa mémoire "réservée" et de faire ensuite "l'allocation"?
Est-ce que cela signifie également qu'un appel à [NSMutableData dataWithLength:length]
ne peut jamais échouer? Peut-il allouer n'importe quelle taille de mémoire en utilisant swap pour l'obtenir si nécessaire?
Si elle peut échouer, ma variable db sera-t-elle nulle?
Dans « NSMutableData Référence de la classe » de la pomme j'ai vu que des phrases vagues sur ces sujets.
Il est possible de modifier le comportement de surcharges Linux en définissant 'overcommit_memory' et' overcommit_ratio'. En particulier, si vous définissez 'overcommit_memory' sur 2, cela signifie que l'espace de swap ne sera validé que par overcommit_ratio% de la mémoire physique. –
Voir aussi la documentation [overcommit-accounting] (http://www.mjmwired.net/kernel/Documentation/vm/overcommit-accounting). –
La chose intéressante à propos de Linux est que 'mmap()' (que malloc fait derrière la surface) prend un drapeau 'MAP_NORESERVE', ce qui permet un comportement de sur-engagement. Cependant, si vous - comme malloc() - ne spécifiez pas ce drapeau, il y aura toujours un sur-engagement. – mvds