美文网首页
iOS 串行队列阻塞引起消息加载慢、分享内存堆积超50MB等问题

iOS 串行队列阻塞引起消息加载慢、分享内存堆积超50MB等问题

作者: 某非著名程序员 | 来源:发表于2021-02-06 09:05 被阅读0次

一、串行队列阻塞

1. 进入聊天界面消息加载不出来(偶现)

问题

网络正常时,点击进入会话,偶现一直在加载。过了段时间又正常。

原因

进入聊天窗口拉取消息、加载历史消息,统一在串行队列中操作。
下面这段是出现问题的伪代码:

dispatch_semaphore_t semaphore_t = dispatch_semaphore_create(0);
...
[BLClientKitDolpServer send:msgDto callback:^(DolpMessageResponse *object, NSError *error) {
     ...
        dispatch_semaphore_signal(semaphore_t);
    }];
    dispatch_semaphore_wait(semaphore_t, DISPATCH_TIME_FOREVER);
    }

弱网时,网络响应比较慢,当前串行队列的任务被阻塞。导致再次进入会话,串行的任务也不会立即执行。
超时结束,展示也就正常了。

解决方案

网络请求不需要异步转同步,把结果以block形式返回。

如何找到这种阻塞的任务

  1. 自定义队列必须添加名称
  2. 关注xcode堆栈信息
  3. 主线程阻塞很好排查,子线程阻塞还是第一次见。攒点经验了。
堆栈

二、串行队列阻塞造成内存数据挤压

1. 共享屏幕内存超50MB问题沟通

问题:iOS 屏幕分享,需要开启一个Extension,但内存限制50MB,超过50MB分享直接闪退。

分析

  1. 这个问题本来一直是同事在跟踪,发现闪退之后,同事去搜索了很多,发现云信是使用socket方式先把数据发送到主进程,再由主进程推。而声网并没有处理这个问题。
  2. 声网那边跟了很久,暂时无果,同事这边做了临时处理,如果内存超过45MB时,不推流,但造成的现象就是经常出现分享视频流卡主不动。
  3. 仔细研究了声网分享出来的demo,声网使用- (void)processSampleBuffer:withType:在不停的推流,调用的是一个串行队列。于是大胆的分析了下,声网捕捉到屏幕变化,不断的抓取屏幕生成CMSampleBufferRef对象,塞到串行队列。而CMSampleBufferRef对象占用内存比较大,当屏幕变化比较大时,造成串行队列挤压。很快就超过50MB。
  4. 最后也得到声网的验证。与内存被打爆这个原因一样。

相关文章

  • iOS 串行队列阻塞引起消息加载慢、分享内存堆积超50MB等问题

    问题 网格正常时,点击进入会话,偶现一直在加载。过了段时间又正常。 原因 进入聊天窗口拉取消息、加载历史消息,统一...

  • IM 消息空白的多种原因

    串行队列阻塞引起消息加载慢[https://www.jianshu.com/p/e92fe5ac2c68]:之前这...

  • 2021--- GCD

    gcd同步,异步,串行队列,并发队列,全局队列,主队列,以及死锁。 1、gcd队列阻塞问题[https://www...

  • RabbitMQ最佳实践

    保证队列中有尽量少的消息堆积 当队列中堆积过多消息时会给内存带来极大的压力,为了释放内存Rabbit会将消息刷至磁...

  • GCD死锁

    GCD死锁原因 GCD死锁的原因是队列阻塞,而不是线程阻塞! 串行和并行 串行和并行都是相对于队列而言的-队列(负...

  • Swift GCD 的串行队列与并行队列

    队列异步是否阻塞当前线程同步是否阻塞当前线程执行顺序串行队列否是按添加顺序并行队列否是同时执行,但会被同步阻塞 串...

  • iOS加载超清大图内存暴涨问题解决

    加载超清大图是会引起内存爆表的问题,最近一直困扰着我。SDWebImage在加载大图时做的不是很好,加载大图内存爆...

  • GCD总结

    概念 队列分为两类,串行队列和并行对列 串行队列,不能同步执行,不然会发现死锁原因分析, 阻塞当前线程,在当前线...

  • iOS多线程编程理解-GCD

    创建队列 创建串行队列 创建并行队列 获取全局队列 系统提供dispatch方法 创建异步任务,开启新线程,不阻塞...

  • 551,GCD的队列嵌套情况下,不同组合方式区别(面试点:一,异

    除了上边提到的『主线程』中调用『主队列』+『同步执行』会导致死锁问题。实际在使用『串行队列』的时候,也可能出现阻塞...

网友评论

      本文标题:iOS 串行队列阻塞引起消息加载慢、分享内存堆积超50MB等问题

      本文链接:https://www.haomeiwen.com/subject/xhbitltx.html