Der folgende Code belegt ca. 410 MB Arbeitsspeicher und gibt ihn nicht wieder frei. (Die Version mit dispatch_sync
anstelle von dispatch_async
wird ~ 8MB Speicher benötigen)
Ich würde eine Spitze von hoher Speicherauslastung erwarten, aber es sollte wieder sinken ... Wo ist das Leck?GCD dispatch_async Speicherleck?
int main(int argc, const char * argv[]) {
@autoreleasepool {
for (int i = 0; i < 100000; i++) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
NSLog(@"test");
});
}
NSLog(@"Waiting.");
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:60]];
}
return 0;
}
Ich habe versucht:
- Hinzufügen @autoreleasepool um und innerhalb der Schleife
NSRunLoop run
an die Schleife Hinzufügen
ich verschiedene Kombinationen ausprobiert und nie eine Abnahme des Gedächtnisses sah (sogar nach dem Warten Minuten). Ich bin mir bewusst, der GCD-Referenzhandbuch, das die folgende Erklärung enthält:
Obwohl GCD Dispatch-Warteschlangen ihre eigenen Autofreigabepools haben, machen sie keine Garantie, wenn diese Pools abgelassen werden.
Gibt es in diesem Code ein Speicherleck? Wenn nicht, gibt es eine Möglichkeit, die Warteschlange zu erzwingen, um die fertigen Blöcke freizugeben/zu leeren?
Das stimmt, aber keine Antwort auf die Frage. Die Speicherauslastung sollte (mindestens) nach dem Ende aller Blöcke wieder sinken. Aber das ist hier nicht der Fall. Ein Spitzenwert von hohem Speicherverbrauch wäre völlig in Ordnung. – Andreas
Ich habe meine Antwort bearbeitet. –