Android应用程序cpu使用率跃升至50-100%,跟踪仅显示JDWP

时间:2016-12-18 13:33:18

标签: java android performance trace

我的应用程序在后台运行一段时间后开始放慢手机的速度。

在我记录了cpu使用情况后,跟踪文件向我显示JDWP在JDWP线程上占用了99%的cpu用量,这是我在跟踪文件中可以看到的唯一线程。

JDWP(Google称为Java调试线协议)是否可能需要占用大量CPU,或者我的跟踪文件有问题吗?在cpu使用率跳跃后,手机开始工作变慢并变热,所以我很确定使用数据是否正常。

以下是仅显示JDWP的2个跟踪文件:
https://drive.google.com/file/d/0B9MtungcpihwZnl0RFIwanktMEk/view?usp=sharing

以下是跟踪记录之前,中间和之后的专辑:
http://imgur.com/a/rOZ4g

命令adb shell top -m 5的输出在这里:
http://pastebin.com/2FJNVvZA

1 个答案:

答案 0 :(得分:1)

JDWP线程不应该运行得太多;它是处理调试器命令的线程,包括IDE自动执行的一些操作。

我不记得曾经看到它耗费了大量的CPU时间,但我想如果你(或者更有可能是某些工具)运行了很多命令,就会发生这种情况。

否则,您可能在虚拟机(ART)或IDE /工具中发现了错误。

如果你想分享跟踪文件,我不介意看看。

更新1 :我看过这些文件。实际上,除了JDWP线程之外没有其他线程。但是,它没有使用大量的CPU - 将光标悬停在顶部的“JDWP”上。阻止并检查Wallclock时间(4.344s)与CPU时间(0.006s)。您也可以在顶部的下拉框中切换到“线程时间”视图而不是“挂钟时间”。

以下是其中一个跟踪文件的人类可读部分:

*version
3
data-file-overflow=false
clock=dual
elapsed-time-usec=4345915
num-method-calls=410
clock-call-overhead-nsec=3808
vm=dalvik
*threads
1       main
14      Thread-7700
13      Thread-7699
12      Thread-7698
11      FileObserver
10      Binder_2
9       Binder_1
8       FinalizerWatchdogDaemon
7       FinalizerDaemon
6       ReferenceQueueDaemon
5       Compiler
4       JDWP
3       Signal Catcher
2       GC
*methods
0x6da675c0      android/ddm/DdmHandleProfiling  handleChunk     (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;  DdmHandleProfiling.java -1
0x6da673c0      android/ddm/DdmHandleProfiling  handleMPRQ      (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;  DdmHandleProfiling.java -1
0x6da67430      android/ddm/DdmHandleProfiling  handleMPSE      (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;  DdmHandleProfiling.java -1
0x6da67468      android/ddm/DdmHandleProfiling  handleMPSS      (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;  DdmHandleProfiling.java -1
0x6d8b4ca0      java/nio/ByteBuffer     order   (Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;     ByteBuffer.java 635
0x6d8b4410      java/nio/ByteBuffer     <init>  (ILjava/nio/MemoryBlock;)V      ByteBuffer.java 116
0x6d8b44f0      java/nio/ByteBuffer     wrap    ([BII)Ljava/nio/ByteBuffer;     ByteBuffer.java 108
0x6d8dd658      java/util/HashMap       get     (Ljava/lang/Object;)Ljava/lang/Object;  HashMap.java    -1
0x6d918008      java/util/Arrays        checkOffsetAndCount     (III)V  Arrays.java     1731
0x6d9913a8      org/apache/harmony/dalvik/ddmc/ChunkHandler     wrapChunk       (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Ljava/nio/ByteBuffer;   ChunkHandler.java       80
0x6d9807d0      android/os/Debug        getMethodTracingMode    ()I     Debug.java      -1
0x6d981100      android/os/Debug        startMethodTracingDdms  (IIZI)V Debug.java      -1
0x6d9811a8      android/os/Debug        stopMethodTracing       ()V     Debug.java      -1
0x6da67040      android/ddm/DdmHandleHeap       handleChunk     (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;  DdmHandleHeap.java      -1
0x6da66e78      android/ddm/DdmHandleHeap       handleHPIF      (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;  DdmHandleHeap.java      -1
0x6d8be8d0      java/lang/Integer       equals  (Ljava/lang/Object;)Z   Integer.java    208
0x6d8be940      java/lang/Integer       hashCode        ()I     Integer.java    302
0x6d8be190      java/lang/Integer       <init>  (I)V    Integer.java    88
0x6d8be740      java/lang/Integer       valueOf (I)Ljava/lang/Integer;  Integer.java    706
0x6d8b5240      java/nio/Buffer <init>  (IILjava/nio/MemoryBlock;)V     Buffer.java     97
0x6dc2d778      org/apache/harmony/dalvik/ddmc/DdmVmInternal    heapInfoNotify  (I)Z    DdmVmInternal.java      -2
0x6d8b5ec8      org/apache/harmony/dalvik/ddmc/Chunk    <init>  (I[BII)V        Chunk.java      45
0x6d9d22a8      java/nio/ByteArrayBuffer        get     ()B     ByteArrayBuffer.java    151
0x6d9d2000      java/nio/ByteArrayBuffer        <init>  (I[BIZ)V        ByteArrayBuffer.java    41
0x6d9d2038      java/nio/ByteArrayBuffer        <init>  ([B)V   ByteArrayBuffer.java    -1
0x6d8b5fe0      org/apache/harmony/dalvik/ddmc/DdmServer        dispatch        (I[BII)Lorg/apache/harmony/dalvik/ddmc/Chunk;   DdmServer.java  143
0x6d8b7128      dalvik/system/VMDebug   getMethodTracingMode    ()I     VMDebug.java    -2
0x6d8b7550      dalvik/system/VMDebug   startMethodTracingDdms  (IIZI)V VMDebug.java    182
0x6d8b76d8      dalvik/system/VMDebug   stopMethodTracing       ()V     VMDebug.java    -2
0x6d8ba1b8      java/lang/Number        <init>  ()V     Number.java     33
*end

如您所见,其他线程至少存在于标题中。

标头不包含对非系统方法的引用。

我不会说你发现一些奇怪的错误是不可能的 - 但我认为你的应用程序更有可能在这一点完全闲置,除了通过JDWP回答跟踪命令的小工作,以及JDWP-only跟踪设法让你有点迷惑。

你的标题提到“50-100%的cpu使用率”,这表明某些东西正在运行。我不清楚你从哪里得到这些数字 - 也许它们包括一切,而不仅仅是你的应用程序?尝试运行adb shell top -m 5以找出系统中的顶级CPU使用者。