全局GCD队列的内存使用情况

时间:2013-10-02 07:55:11

标签: grand-central-dispatch

我有一些我正在过滤的图像,当我在我创建的串行队列中执行此操作时,在每个块完成后释放内存。当我将此工作分派给全局GCD队列时,内存不会释放并失控。

我将语句包装在自动释放块中,但这似乎没什么区别。

是否由于线程池以某种方式保留对块的引用?一段时间后内存被释放,但应用程序将在此之前崩溃,并显示大量图像。

为什么内存由全局队列保存,如何修复以便在每个块之后释放?

1 个答案:

答案 0 :(得分:2)

您在评论中提到GCD似乎创建了太多线程,导致过多的图像同时存在于内存中。如果GCD产生“负载线程”,其中负载是> 3x内核数量,这可能意味着您提交给它的块最终被阻止(可能是在I / O上)。更高效的方法是序列化串行队列上的I / O,并且只进行并行内存处理。在这方面从GCD获得帮助的一种方法是使用dispatch_apply来限制并发操作的数量。 IME dispatch_apply不会创建超过2 *个核心数的线程。 (虽然这不会考虑可能创建线程的其他并发操作。)

另外,正如您所指出的,NSOperationQueue允许您指定最大并发任务数,这是另一种方法。