线程大概应该非常熟悉了,一般面试问得比较多的可能是线程池相关的一些原理。
不过在一个更高阶的面试过程中,可能会问考察线程与内存之间的一些联系。
大家有没有思考过,目前业内一些头部 app,例如微信,抖音等,他们在运行时大概有多少个线程存活?
另外如果大家比较关注 OOM 的话,线程比较多可能会导致 OOM,当然线程多导致OOM的原因不止一种,先不深究,想考虑一个问题:每个线程会占据多少内存?
总结下问题:
- 如何查看一个 app 在运行时,大概有多少线程在运行?
- 每个线程会占据多少内存空间?这个内存空间是固定大小的吗?还是一开始很少,随着你方法调用越来越多,而动态增加?
- 如何拿到一个线程已经使用的栈空间?
- 我们能够调整一个线程占据的内存大小吗?
更多问答 >>
-
每日一问 | 在做性能优化的时候,常常看到 Thread(Cpu) Time,Wall clock Time?
2021-03-15 00:43 -
每日一问 | onDraw 里面调用 invalidate 做动画,有什么问题?
2021-04-13 00:31 -
每日一问 | mipmap vs drawable,傻傻分不清楚?
2021-03-30 21:14 -
2021-04-08 00:25
-
每日一问 | 听说你做过内存优化 之 Bitmap内存占用到底在哪?
2021-04-19 23:40 -
每日一问 | 今天还探索一个 View 的方法 hasOverlappingRendering()
2021-02-21 20:16 -
每日一问 | 类要先加载、链接、初始化才能实例化,有特殊Case吗?
2021-02-21 20:15 -
2021-01-31 16:58
-
每日一问 | Android 中两种设置线程优先级的方式,有何区别?
2021-01-27 23:59 -
每日一问 | Java 中的 lambda 与 Android 中的 lambda 有什么不同?
2021-01-31 17:20
Android Profiler 的 CPU 中的THREADS 也能看到运行的线程
只了解到这些...
1.查看应用 进程 和 进程 对应的线程信息
2.每个线程会占据多少内存空间?这个内存空间是固定大小的吗?还是一开始很少,随着你方法调用越来越多,而动态增加?
Thread 类的方法有提供对应的方法c层等一个大佬
测试 新开线程循环调用方法 会让App使用的内存越来越多。
线程私有的是 虚拟机栈 和 本地方法栈。
所有会随着方法的内部调用 入栈出栈 从而使空间的大小变化。
3.如何拿到一个线程已经使用的栈空间?
获取所有的堆栈信息
然后计算每一个 栈帧 的大小之和 ?
不确定这个
VSIZE
是不是线程所占的栈空间https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/ps.html
VSIZE
固定不变,RSS
会增大所以 问题2 是固定大小???
4.我们能够调整一个线程占据的内存大小吗?
通过Thread的构造方法 配置的好像没有效果等一个大佬
输出
2. 每个线程会占据多少内存空间?这个内存空间是固定大小的吗?还是一开始很少,随着你方法调用越来越多,而动态增加?
如果算上 TLAB 的话,线程占据的内存空间分为两部分:首先使用 adb shell ps | grep "包名" 得到 pid
然后使用 adb shell cat /proc/pid/status 查看Threads字段得到当前进程的线程数。根据官方说法:每个线程至少占用64k,设备上安装的众多应用会使这一数字迅速累加,特别是在调用堆栈显著扩大的情况下。