FOOM SOLUTION 1 :SERIAL ACCESS CGContext

194 阅读1分钟

FOOM(Foreground Out Of Memory),code.facebook.com/posts/11469…,app前台因为内存暴增引起的前台系统级crash,使用市面上大部分的监测工具都无法获取调用堆栈。如何监测可以学习《iOS微信内存监控》。本文旨在如何处理由于内存暴增引起的FOOM问题处理。

内存增大,大部分罪魁祸首都是图片资源。为了增强用户体验,保证高fps的图片缓存框架一般都会进行强制解码,带来的弊端就是会在内存中产生大量的VM:CGRaster Data,如果在短时间内decode过多图片就会引起crash。

通过调研发现Twiter的image-pipeline提供了一个较为有效的方法,分享给大家。通过顺序访问CGContext可以有效降低,在很短时间内出现峰值而导致app被kill。

void ExecuteCGContextBlock(dispatch_block_t block)

{

static dispatch_queue_t sContextQueue;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

    sContextQueue =dispatch_queue_create("xxx.CGContext.queue",DISPATCH_QUEUE_SERIAL);

});

@autoreleasepool {

    dispatch_sync(sContextQueue, block);

}

}