问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

pthread_create ——我与华为线程的争斗

发布网友 发布时间:2022-10-13 16:41

我来回答

1个回答

热心网友 时间:2023-11-06 07:34

好久不见,值此年终之际,跟大家探讨一下,一个诡异的内存溢出。

话不多说,先上崩溃

很显然,创建了一个线程,1040kb,内存溢出。
正好我们比对一下一般的内存溢出的情况是怎样的。

当再次分配内存的时候出现了内存溢出。
那么我会猜测以上两种情况是否都是内存不够用了,或者说上面的是否和下面的一样是因为内存不够用了引起的。
为什么恰好的创建线程的时候崩溃了,创建线程需要的内存通常不会很大,就真的那么巧,这一根稻草压垮了骆驼?

在此直接吐结论,因为探索 pthread_create 的内存溢出原因,不是本文的主旨,本文主要探讨是如何斗争。

大家应该都知道,线程创建的越多,资源就消耗的越大,android本身并没有为我们*应用承受的最大线程数,将控制权交由应用设计者自己。

那么很明显国内的厂商,并不相信国内的开发,或者说国内的厂商由于自己的定制导致你即使遵循了应用的开发之道,却依然难以避免产生大量的冗余线程。

因此华为带头出击,魅族随后,分别将自己的大量机型可控线程数调至500和3000。

如果你深表怀疑或者依然存有困惑,送你如下传送门

首先我们需要将应用中可能出现的所有与线程相关的地方找到,或者说找出应用中可能会出现线程池的地方。

此处只举个例,不做穷举。

啥都不说,我们从构造方法开始

当来了一个新的任务

总结来说就是 核心 > 队列 > 非核心 > handler

OK,当我们真的搞清楚了,到底 Executor 是怎么一回事了之后,我们来拿 Retrofit1 的 RestAdapter 看一下。

进到 RestAdapter 的内部类 Builder 类。

如果你不去专门设置httpExecutor,那么Retrofit就会帮你设置一个默认的,具体是怎样的线程池,我们继续看。

直接去Platform的实现类Android,来找到底 defaultHttpExecutor 是个啥,一看 newCachedThreadPool 基本就明了了,使用了系统封装好的缓存线程池,可以再细看一下:

按照我们上面分析的,核心线程为0个,使用同步队列,SynchronousQueue是没有容量的,此处不做详解,按照目前的逻辑,只要是需要执行的task,一旦put了会立马被take,此处对同步队列不做详解,各位可以自行钻研。可以认为一旦有任务进来,会立马创建新的线程,如果线程空闲60秒就会被干掉。

因此,理论上来说,这个线程池在极端情况下可以产生 Integer.MAX_VALUE 个线程,那么当这个数字直线上升的时候,就可以看到华为,魅族,相距的崩掉(出于本身ANR的保护,你可能很难看到3000的魅族崩,甚至其他的上万*的手机崩掉

因此为了避免此类情况的发生,我们需要给出自定义的线程池方案,你可以选择有限的最大线程数配合 SynchronousQueue 队列,或者选择有限的最大线程数配合有限容量的 BlockingQueue 其他实现类。

比如

各位可以自己摸索钻研到一套最适合自己应用场景的线程池配置。
记住,一旦出现了有上限的线程池,必须要设置溢出策略,上面采用了 new ThreadPoolExecutor.DiscardOldestPolicy() 方式,该策略会当线程池溢出时,抛掉缓存队列中最先进去的那个,插入新来的。

优化线程数,远远不止于此。

再比如不同的api域名,通常我们需要创建不同的 Retrofit 对象,而不同的 Retrofit 对象,都需要进行初始化,传入不同的 OkhttpClient 和相同的 OkhttpClient 也会有很大的线程数差距。

重要的还是在平时的编码过程中,善于观察,善于测试,善于从崩溃日志中过滤无用信息,定位到线程崩溃点。

最后,为无法理解华为的线程*抓耳挠腮10分钟。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
艾芙洛洗发水为什么不在商场销售商 艾芙洛洗发水是英国的吗 毕业生刚刚签了三方协议,想毁,怎么办 适合夫妻干的生意有哪些 新生蜜蜂多久出巢试飞 新生蜜蜂什么时候进行首次试飞? 蜜蜂几月几日出生外貌和颜色? 当脚模一定要脚趾修长吗 脚长成这样,能当脚膜吗 固话遇忙记存呼叫业务有什么特点? 什么是固话遇忙记存呼叫业务? ThreadPoolExcutor用法详解 Spring Boot中异步线程池@Async详解 求凯莉小说全集 促销商品英语怎么说啊 在平面地球仪上怎样辨别中午子夜等 我嫁给有钱老公,每个月有三万零花钱,可我就像是被囚禁了一样,怎么办? 北大陈静雯是哪一年的高考状元 苹果笔记本安装系统需要对照美国时间吗 重庆市南岸区融侨半岛云满庭C区 英文翻译,谢谢哪位仁兄帮忙 大学毕业季离别文案 汉中有没有通信管理局?拜托各位大神 教师节主题征文:我心目中的好老师? 我心中的好老师征文(小学组) 我心目中的老师话题作文 第33个教师节主题征文:我心目中的好老师? 教师节我心目中的好老师征文 教师节作文:我心目中的老师 大众新polo节气门怎么清洗,新polo节气门清洗方法 切除胆囊后可食红豆,花生,红薯糖水吗? 胆囊摘除15天后可以吃地瓜和紫薯吗? Elasticsearch(3台master和3台data)配置文件详解 ElasticSearch查询流程详解 七年级数学上学期期中测试卷子与答案 七年级数学期中试卷 there are many snakes in Australia这个俚语什么意思,那位高手和我讲一下? 网络赌博银行卡被冻结里面的钱能拿出来吗 金融是一国的经济命脉吗 求一部BL漫画,攻是一只豹子,受是人。受在草原拍攻的照片,攻很难被拍到。一个月吧受想着这次总能拍到 二年级养蚕日记 孩子玩耍时总是变成“泥娃娃”,为何这类孩子如此偏爱玩泥呢? 孩子爱玩泥巴怎么办? 漳平市动物卫生监督所在哪里? 漳平金色华城在哪里 漳平凯源哪里有古筝琴行 Intel平台最好的整合主板是什么(显卡最好)? 步步惊心的女主角若曦的真是性名是什么? 《*荣誉》开播啦,这部剧的演员阵容如何?能否在*题材电视剧破圈呢? 凤梨和菠萝实则上就是一种水果中的不同品种,凤梨是不是菠萝? 狼的翻译及字词解释ppt 狼和小羊教学设计