【问题标题】:Android count number of threads for an app/processAndroid 计算应用程序/进程的线程数
【发布时间】:2014-06-09 17:18:03
【问题描述】:

我需要监控我的应用的行为并收集有关线程如何创建/销毁的统计信息。我知道 DDMS 有一个线程视图可以实时显示这些信息,但是我可以通过命令行获得相同的信息吗?我想创建自己的工具来记录这些信息并对其进行处理。

澄清: 我正在寻找的是可以通过 ADB 传递的命令,它将列出在进程下运行的线程。这样,我可以在不同的时间点运行命令以获取一段时间内所有线程的状态(线程数及其名称)。

【问题讨论】:

  • 请更具体地说明您要实现的目标。你有一些代码要显示吗?你试过什么?
  • 我试过 cat /proc//status,这给了我线程数。有没有更好的方法可以获取线程的更多详细信息?

标签: android multithreading adb


【解决方案1】:

有两种方法可以做到这一点。
在 Ubuntu 12.10 上的摩托罗拉 Moto G 上试过这个

  1. 您可以使用top(在 ADB Shell 下)列出所有设备上运行的线程。

    $ top -t
    PID   TID PR CPU% S     VSS     RSS PCY UID      Thread          Proc
    271   895  1   0% S  11120K   1892K     root     netd            /system/bin/netd
    272   272  0   0% S   1040K    200K     root     debuggerd       /system/bin/debuggerd
    274   274  2   0% S  63256K   7008K  fg system   surfaceflinger  /system/bin/surfaceflinger
    274   451  0   0% S  63256K   7008K  fg system   Binder_1        /system/bin/surfaceflinger
    

    因此,要获取任何特定流程的详细信息,您可以使用grep

    $ top -t | grep com.whatsapp
    PID   TID   PR CPU% S     VSS     RSS PCY UID      Thread          Proc
    15210 15210  0   0% S 550076K  51180K  bg u0_a96   com.whatsapp    com.whatsapp
    15210 15214  0   0% S 550076K  51180K  bg u0_a96   GC              com.whatsapp
    15210 15215  0   0% S 550076K  51180K  bg u0_a96   Signal Catcher  com.whatsapp
    15210 15216  0   0% S 550076K  51180K  bg u0_a96   Compiler        com.whatsapp
    

    要在您的主机上运行它,只需使用

    $ adb shell top -t | grep com.whatsapp
    

    如果不支持grep,请使用Busybox

  2. 如果您正在寻找 静态 视图。你也可以使用ps

    $ ps -p 15210 -t                                         
    USER     PID   PPID  VSIZE  RSS   PRIO  NICE  RTPRI SCHED   WCHAN    PC         NAME
    u0_a96   15210 275   549036 52136 20    0     0     0     ffffffff 00000000 S com.whatsapp
    u0_a96   15214 15210 549036 52136 20    0     0     0     ffffffff 00000000 S GC
    u0_a96   15215 15210 549036 52136 20    0     0     0     ffffffff 00000000 S Signal Catcher
    u0_a96   15216 15210 549036 52136 20    0     0     0     ffffffff 00000000 S Compiler
    

    其中15210 是您的进程com.whatsapp 的PID

希望这能解决您的问题,让我知道它是否有效。

【讨论】:

    【解决方案2】:

    在我有限的知识中,我可能完全错了,看看:

    public static Map<Thread,StackTraceElement[]> getAllStackTraces()    
    

    文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getAllStackTraces()

    返回所有活动线程的堆栈跟踪映射。地图键是 线程和每个映射值是一个 StackTraceElement 数组 表示对应线程的堆栈转储。返回的 堆栈跟踪采用为 getStackTrace 方法指定的格式。 调用此方法时线程可能正在执行。堆栈 每个线程的跟踪仅代表一个快照,每个堆栈跟踪 可以在不同的时间获得。一个零长度数组将是 如果虚拟机没有堆栈跟踪,则在映射值中返回 关于线程的信息。

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多