背景
如何查看当前进程的线程数量。 比如一个app发现ui线程的调度一直在Runnable(待调度执行)中,而不是出于Running,那么就要看这个时候CPU的每个核心在跑什么,频率怎么样。 比如频率很高,每个核心吃满了,但是ui线程依然Runnable,那么就得看其他线程在干嘛了。
adb shell
ps -A
//查看全部进程
拿到pid之后
ps -T -A | grep pid
//就是整个app的线程信息了。下面是例子。一个空工程 + 一个线程保存log到文件
ursa:/ $ ps -T -A | grep 26644
u0_a184 26644 26644 672 5311996 139720 0 0 S module_logutils
u0_a184 26644 26650 672 5311996 139720 0 0 S Jit thread pool
u0_a184 26644 26655 672 5311996 139720 0 0 S Signal Catcher
u0_a184 26644 26661 672 5311996 139720 0 0 S ADB-JDWP Connec
u0_a184 26644 26663 672 5311996 139720 0 0 S HeapTaskDaemon
u0_a184 26644 26664 672 5311996 139720 0 0 S ReferenceQueueD
u0_a184 26644 26665 672 5311996 139720 0 0 S FinalizerDaemon
u0_a184 26644 26666 672 5311996 139720 0 0 S FinalizerWatchd
u0_a184 26644 26667 672 5311996 139720 0 0 S Binder:26644_1
u0_a184 26644 26668 672 5311996 139720 0 0 S Binder:26644_2
u0_a184 26644 26680 672 5311996 139720 0 0 S Binder:26644_3
u0_a184 26644 26693 672 5311996 139720 0 0 S Profile Saver
u0_a184 26644 26695 672 5311996 139720 0 0 S RenderThread
u0_a184 26644 26698 672 5311996 139720 0 0 S Binder:intercep
u0_a184 26644 26699 672 5311996 139720 0 0 S magnifier pixel
u0_a184 26644 26700 672 5311996 139720 0 0 S chancesThread1
u0_a184 26644 26701 672 5311996 139720 0 0 S pool-2-thread-1
u0_a184 26644 26704 672 5311996 139720 0 0 S AsyncTask #1
u0_a184 26644 27040 672 5311996 139720 0 0 S chancesThread2
ursa:/ $
如果想一直观察当前app的线程数量,可以通过脚本来做。 比如你已经知道进程的pid,还有他名字。
#!/bin/bash
for((i=1;i<=10000;i++));
do
##替换成需要做的动作
sleep 1 #睡眠一秒
adb shell ps -T | grep u0_a208 | wc -l
#我打印了命令,如果你不需要,可以忽略
#u0_a208 pid前面的user
echo 'adb shell ps -T | grep u0_a208 | wc -l';
done
这样就可以观察线程数目的变化了。比如你进入某个页面的时候,看看线程有没有变化。通过这样的简单观察,如果发现线程数目一直增加,那么就是有问题。长时间下去可能会oom。即使不oom也有可能产生卡顿或者ANR。因为线程越来越多,就意味着CPU到时候忙不过来,调度自然跟不上了。
还有一个方式是,打开as,打开profiler,点击CPU,进去之后也可以实时看到线程数目,CPU使用率,等等详细信息。
有个头疼的事情,我怎么知道这些线程是哪里创建的或者触发的,比如进入某个页面后,我怎么快速定位线程的创建和调用呢,找到线程的使用者呢。如果你知道,赶紧来评论区告诉我。
如果我有方法,我会补充这个文章。这一篇属于残次品。