TT语音线程优化,深入讲解Android

             }

            if (e.className == "me.weishu.epic.art.entry.Entry" && e.methodName == "referenceBridge") {
                isCanAppendLog = true
            } else {
                if (isCanAppendLog) {
                    normalInfo.append("\n${e.className}(methodName:${e.methodName},lineNumber:${e.lineNumber})")
                }
            }
        }
        normalInfo.append("\n=====================================threadTraceEnd=======================================")
        Log.i(tag, normalInfo.toString())
    }
}

companion object {
    const val tag = "====>ThreadCheck"

    fun hook() {

        if (!BuildConfig.DEBUG) {
            return
        }

        DexposedBridge.hookAllConstructors(Thread::class.java, ThreadCheck())
    }
}

}


日志打印格式
------

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d6c6119245374551890b33ff3d305203~tplv-k3u1fbpfcp-watermark.image)

从上图结合下图可以看出在下面的类创建了AsyncTask,而且使用完后没有立即销毁,造成了内存的浪费,而且,频繁的创建线程可能会导致APP因为线程数量过多造成OOM

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0e4332836e6d419b8cca60ca29aaa444~tplv-k3u1fbpfcp-watermark.image)

分析
--

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7550c8a6515645ea80aae594807ae260~tplv-k3u1fbpfcp-watermark.image)

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f702f8e7b33a4f1da610bb9156a277d3~tplv-k3u1fbpfcp-watermark.image)

如上图所示,TT语音在android8.0以上的机型上出现的大量这种类似的OOM,这是因为线程数量过多或者虚拟内存不足造成的,创建线程是需要消耗虚拟内存的,不同机型允许的最大线程数量是不一样的,例如在华为的部分机型上,这个上限被修改的很低(大约500),需要注意的是,**APP的线程总数=工作中的线程数+sleep状态的线程数**,所以这些手机容易出现线程数溢出的问题,而TT语音一进入首页就会大概创建240个左右的线程,虽然这里面有很多线程都是很快就工作结束的,然后变成无用线程的,也就是说这些工作结束后的线程并不会计入APP的线程总数中,但是,频繁的创建线程依然可能会导致上图中的OOM,因为尽管他们工作时间很短,但是依然可能是压垮骆驼的最后一根稻草,而且,频繁的创建线程,会造成虚拟内存的消耗,加大OOM的可能性,因此,尽量减少线程的创建是线程优化的关键一步,然后,开始统计线程使用情况,情况如下:

线程使用情况
------

  1. 代码中使用 new Thread或者new AsyncTask或者new HandlerThread创建的线程,例如上图中创建了AsyncTask
  2. 获取SharePreferences对象的时候创建的线程,每次获取SharePreferences对象的时候都会重新创建线程,原因是我们获取SharePreferences对象的模式是多进程模式,这个情况下每次获取SharePreferences对象的时候都会创建新线程
  3. 代码中协程创建的线程
  4. 第三方sdk创建的线程以及获取SharePreference对象创建的线程
  5. 代码中使用线程池创建的线程
  6. Maven依赖库创建的线程

优化方式
----


### 学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

**2021最新上万页的大厂面试真题**

![](https://www.icode9.com/i/ll/?i=img_convert/8d1970fdf49378354dbf4ead8fede65f.png)

**七大模块学习资料:如NDK模块开发、Android框架体系架构…**

![](https://www.icode9.com/i/ll/?i=img_convert/5580deccc64e977604f3b48b7f594387.png)

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

> 这份体系学习笔记,适应人群:
> **第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
> **第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
> **第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://codechina.csdn.net/m0_60958482/android_p7)**

### 由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

ps://codechina.csdn.net/m0_60958482/android_p7)**

### 由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

上一篇:[2021.10.3NOIP模拟] 数据恢复


下一篇:2021蓝桥杯B组(没参加比赛, 小白随便写写)