Ten12
Ten12
因为APP异常关闭,会导致日志文件缺少压缩结束符。所以最后一条日志解析不全。 目前建议: - 重要日志,手动flush - APP重大事件,如进入后台。手动flush
已在1.2.7版本修复,请更新版本。
定位到是因为动图导致oom。在sd中,开始播动画时,会分配缓存帧的maxBufferCount。分配完后不会立马解析图片帧去填充这些buffer,导致给下一个动画分配maxBufferCount时,用于计算的系统的空间大于实际可以分配的空间。 举个例子:卖车票,有人来买票,只要车上有空位置就会把车票卖给他,买了车票的人可能不会立马上车。4个空位的车,可能卖出8张车票,8个拿车票的人来上车时发生了oom。 每隔三帧就重新计算maxBufferCount优化 https://github.com/SDWebImage/SDWebImage/pull/3445
没有太大的效果。我们在本地能用一些极端情况可以复现出相关crash。 - 首先控制台会打印 CGSImageDataLock: Cannot allocate memory 。但实际观察并没有占用过多的内存,还剩下很多内存。 - 有多个线程都是在跑 ImageIO相关内容 猜想本地业务使用不当时,触发了并行渲染多个sdwebimageview,从而多个并发调用CGContextDrawImage()方法时,报了Cannot allocate memory造成crash。 这个堆栈和线上堆栈基本一样: 2023-01-13 18:25:55.035290+0800 XXXX[51559:2102760] [Unknown process name] CGSImageDataLock: Cannot allocate memory 2023-01-13 18:25:55.056624+0800 XXXX[51559:2102743] [Unknown process...
首先控制台会打印 CGSImageDataLock: Cannot allocate memory 。但实际观察并没有占用过多的内存,还剩下很多内存。 观察的内存并不一定是实际可以使用的内存。 原因是内存导致这种崩溃也说得过去。但为什么使用yy时,崩溃很少几乎没有,yy与sd两者实现的差别在哪里呢?
SD_LOCK(_lock); currentFrame = self.frameBuffer[@(currentFrameIndex)]; SD_UNLOCK(_lock); // Update the current frame if (currentFrame) { SD_LOCK(_lock); // Remove the frame buffer if need if (self.frameBuffer.count > self.maxBufferCount) { self.frameBuffer[@(currentFrameIndex)] = nil; }...