Mã sau sẽ chiếm ~ 410MB bộ nhớ và sẽ không phát hành lại. (Phiên bản sử dụng dispatch_sync
thay vì dispatch_async
sẽ yêu cầu bộ nhớ ~ 8MB)
Tôi mong đợi mức sử dụng bộ nhớ cao nhưng sẽ giảm xuống một lần nữa ... Trường hợp bị rò rỉ ở đâu?GCD dispatch_async leak memory?
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;
}
tôi đã cố gắng:
- Thêm @autoreleasepool xung quanh và bên trong vòng lặp
- Thêm
NSRunLoop run
vòng lặp
Tôi đã thử nhiều kết hợp và không bao giờ nhìn thấy một giảm bộ nhớ (ngay cả sau khi chờ đợi phút). Tôi nhận thức được hướng dẫn tham khảo GCD, trong đó có tuyên bố sau:
Mặc dù GCD hàng đợi công văn có hồ bơi autorelease riêng của họ, họ không đảm bảo như khi những hồ đang cạn kiệt.
Có rò rỉ bộ nhớ trong mã này không? Nếu không, có cách nào để thực thi hàng đợi để giải phóng/thoát các khối đã hoàn thành không?
Đó là sự thật nhưng không phải là câu trả lời cho câu hỏi. Việc sử dụng bộ nhớ sẽ giảm xuống một lần nữa (ít nhất) sau khi tất cả các khối đã kết thúc. Nhưng đó không phải là trường hợp ở đây. Sự tăng đột biến sử dụng bộ nhớ cao sẽ hoàn toàn ổn. – Andreas
Tôi đã chỉnh sửa câu trả lời của mình. –