在使用GPUImage合成视频的时候碰到了“Message from debugger: Terminated due to memory issue”的问题,在Stack Overflow上搜了半天,发现很多种情况下都可能会出现这个问题,而且这个问题也不一定是因为内存占用太高造成的,也有可能是内存使用错误造成的,比如说内存重复使用等等。。。
我遇到的场景是内存占用稳定在100M左右,并没有什么大的变化,所以应该不是内存占用太高的问题,而应该是内存使用错误的问题,但Xcode又没有给出任何提示,只有单单的一句“Message from debugger: Terminated due to memory issue”,这个就很蛋疼了。
因为程序不是一开始就报错,是跑了几秒钟之后才报错,所以我就尝试单步调试,看能不能具体定位到是哪里出错,但很遗憾的是,这个方法行不通,单步断点下去很久都不会报错,或者根本全程都没报错。。。这让我突然想到,会不会跟多线程有关呢?
然后猛然瞅见断点的位置:Thread 10 Queue : com.apple.root.default-qos (concurrent)
我是直接用DispatchQueue.global().async {}
来执行这段代码的,
难道DispatchQueue.global().async {}
派发的队列原来是个concurrent队列?
这可从来没有注意到过。。。
抱着试一试的心态,我自己创建了一个串行队列,然后用这个队列来执行这段代码,
let queue = DispatchQueue(label: "com.lxm.testSerialQueue")
queue.async { xxx }
结果居然没问题了😓😓😓😓😓😓
具体什么原理我还没搞清楚,但用一个串行队列确实解决了这个问题(也许只是个例,碰巧。。。)
有空再仔细研究一下吧。。。
哪位大佬知道原因,望不吝赐教~
网友评论