profiler_profiler server sql 安装包 - CSDN
  • profiler详细使用

    千次阅读 2019-04-06 10:27:11
    Android Profiler分为三大模块: cpu、内存 、网络。基本的使用在上一篇文章有讲到。这里详细说一下。 一、 CPU分析器CPU Profiler CPU分析器可帮助您实时检查应用程序的CPU使用情况和线程活动,并记录方法跟踪,...

    Android Profiler分为三大模块: cpu、内存 、网络。基本的使用在上一篇文章有讲到。这里详细说一下。
    一、 CPU分析器CPU Profiler

    CPU分析器可帮助您实时检查应用程序的CPU使用情况和线程活动,并记录方法跟踪,以便您可以优化和调试应用程序的代码。

    要打开CPU Profiler,请按照下列步骤操作:

    • 点击 View > Tool Windows > Android Profiler (还可以点击工具栏的image).
      从Android Profiler工具栏中选择要配置的设备和应用程序进程(如果您已通过USB连接设备但未看到它,请确保已启用USB调试)
      单击CPU时间轴中的任意位置打开CPU Profiler。

    1.1 为什么要优化CPU的使用

    优化CPU使用率有许多优点,例如提供更快更流畅的用户体验,并保持设备电池寿命。它还可以帮助您的应用程序在各种较新旧的设备上运行良好,您可以使用CPU分析器在与应用程序交互时监视CPU使用情况和线程活动,但是,有关应用程序执行代码的更详细信息,应记录并检查方法跟踪。

    对于应用程序进程中的每个线程,您可以找到在一段时间内执行哪些方法以及每个方法在执行期间消耗的CPU资源。您还可以使用方法跟踪来识别调用者和被调用者,调用者是一种调用另一种方法的方法,被调用方是另一种方法调用的方法。您可以使用此信息来确定哪些方法太频繁地调用特定资源繁重的任务,就可以尝试优化应用程序的代码以避免不必要的工作。

    如果要收集详细的系统级数据,帮助您检查本地系统进程并解决由丢帧引起的UI jank,则应使用Systrace。或者,如果要导出使用Debug捕获的.trace文件,则应使用Traceview
    1.2 CPU Profiler概述

    当您打开CPU分析器时,它会立即开始显示应用程序的CPU使用情况和线程活动。你会看到类似于下图的内容
    image

    如上图所示,CPU Profiler的默认视图包括以下内容:

    ①Event timeline: 显示您的应用程序在其生命周期中转换不同状态的活动,并指示用户与设备的交互,包括屏幕旋转事件。要了解有关事件时间轴的更多信息,包括如何启用它,请阅读我上一篇文章说到的启用高级分析
    ②CPU timeline: 显示您的应用程序的实时CPU使用率(占总可用CPU的百分比)以及应用程序使用的线程总数,时间轴还显示其他进程的CPU使用情况(如系统进程或其他应用程序),所以您可以将其与应用程序的使用情况进行比较。您可以通过沿着时间轴的水平轴移动鼠标来检查历史CPU使用率数据。
    ③Thread activity timeline: 列出属于您的应用程序进程的每个线程,并使用不同的颜色在时间轴上指示其活动。记录方法跟踪后,可以从此时间轴中选择一个线程,在跟踪窗格中检查其数据。 
        绿色: 线程处于活动状态或准备好使用CPU。也就是说,它处于”运行”或”可运行”状态。
        黄色: 线程处于活动状态,但是在完成其工作之前,它正在等待I / O操作(如文件或网络I / O)。
        灰色: 线程正在睡眠,不会消耗任何CPU时间,当线程需要访问尚未可用的资源时,有时会发生这种情况。要么线程进入自愿性睡眠,要么内核使线程休眠,直到所需的资源可用。
    ④Tracing type:允许您选择以下选项之一来确定分析器如何记录方法跟踪。 
        Sampled: 在应用程序执行期间,您可以频繁地捕获应用程序的调用堆栈。profiler将捕获的数据集进行比较,以获取关于应用程序代码执行的时间和资源使用信息。基于sampled跟踪的一个固有问题是,如果您的应用程序在捕获调用堆栈并在下一次捕获之前退出该方法,那么该方法调用不会被分析器记录。如果您对具有这样短生命周期的跟踪方法感兴趣,您应该使用工具跟踪。
        Instrumented: 在您的应用程序运行时记录每个方法调用的开始和结束时的时间戳。收集时间戳并与生成方法跟踪数据进行比较,包括时间信息和CPU使用。请注意,对每种方法进行检测的开销会影响运行时性能,并可能影响性能分析,因此对于具有相对较短的生命周期的方法来说,这更加值得注意。此外,如果您的应用程序在短时间内执行大量的方法,profiler可能很快超过它的文件大小限制,进而不能记录任何进一步的跟踪数据。
    
    ⑤Record button:开始和停止记录方法跟踪。要了解更多信息,请继续看下去
    
        提示:profiler还报告了Android Studio和Android平台在你的应用程序过程中添加的线程的CPU使用情况,如JDWP、Profile Saver、Studio:VMStats、Studio:Perfa和Studio:Heartbeat(尽管,在线程活动时间线中显示的确切名称可能会有所不同)。这意味着您的应用程序在CPU时间轴上的CPU使用率也会报告这些线程使用的CPU时间。您可以在线程活动时间表中看到这些线程,并监视它们的活动。(但是,由于profiler线程执行native代码,因此无法为它们记录方法跟踪数据。)Android Studio会报告这些数据,这样你就可以很容易地识别出线程活动和CPU使用实际上是由你的应用程序代码引起的。
    

    1.3 记录和检查方法跟踪

    要开始记录方法跟踪,从下拉菜单中选择Sampled或Instrumented类型,然后单击Record开始进行记录,完成后点击Stop recording停止记录。profiler自动选择记录的时间帧,并在方法跟踪窗格中显示它的跟踪信息,如下图所示。如果要检查不同线程的方法跟踪,只需从线程活动时间轴中选择它。
    image

    ① Selected time frame: 在跟踪窗格中检查的记录时间框架的部分。当您第一次记录一个方法跟踪时,CPU分析器将自动选择您在CPU时间线中记录的整个长度。如果要检查仅记录的时间帧的一部分的方法跟踪数据,您可以单击并拖动高亮显示区域的边缘来修改它的长度。
    ②Timestamp: 表示记录方法跟踪的开始和结束时间(相对于profiler开始从设备收集CPU使用信息时)。你可以点击时间戳来自动选择整个记录作为你选定的时间框架——如果你有多个你想要转换的记录,这是非常有用的。
    ③Trace pane:显示您所选择的时间框架和线程的方法跟踪数据。仅当您记录至少一个方法跟踪后,此窗格才会显示。在此窗格中,您可以选择如何查看每个堆栈跟踪(使用跟踪选项卡)以及如何测量执行时间(使用时间参考下拉菜单)。
    ④: 选择显示为Top Down tree, Bottom Up tree, Call Chart, or Flame Chart这些类型的图。您可以在下面的部分中了解有关每个跟踪窗格选项卡的更多信息。
    从下拉菜单中选择以下选项之一,以确定如何测量每个方法调用的时序信息: 
        Wall clock time: 表示实际经过时间。
        Thread time:计时信息表示实际的消耗时间减去不消耗CPU资源的那段时间的任何部分。对于任何给定的方法,它的线程时间总是小于或等于它的时钟时间。使用线程时间让您更好地了解给定方法所消耗的线程实际CPU使用量
    

    1.3.1 使用Call Chart选项卡检查跟踪

    Call Chart选项卡提供一个方法跟踪的图形表示,其中一个方法调用(或调用者)的周期和时间在水平轴上表示,而它的callees则显示在垂直轴上。对系统api的方法调用以橙色显示,调用您的应用程序自己的方法以绿色显示,方法调用第三方api(包括java语言api)以蓝色显示。下面的图显示了一个示例调用图,并说明了给定方法的自时间、子时间和总时间的概念。关于如何使用自上而下和自下而上检查痕迹的部分,请继续看下去

    图3

    提示: 如果想要跳转到方法的源代码,请右键单击该方法,然后选择Jump to Source。这可以从任何窗格选项卡工作。
    

    1.3.2 使用火焰图表(Flame Chart)选项卡检查痕迹

    火焰图选项卡提供了一个反向调用图表,聚合了相同的调用堆栈。也就是说,收集相同的调用序列的相同方法被收集并表示为火焰图中的一个较长的栏(而不是将它们显示为多个更短的条,如调用图所示)。这样就更容易看出哪些方法消耗的时间最多。然而,这也意味着横轴不再表示时间轴,相反,它表示每个方法执行的相对时间。

    为了帮助说明这个概念,考虑下面图4中的调用图表。注意,方法D对B(B1、B2和B3)进行多次调用,其中一些调用B对C(C1和C3)进行调用。

    image

    因为B1、B2和B3共享相同的序列调用者(A→D→B)聚合,如下所示。同样,C1和C3聚合,因为它们共享相同的序列调用者(A→D→B→C)注意不包括C2,因为它有不同的调用者序列(A→D→C)。

    image

    聚合方法调用用于创建flame 图,如下图所示。注意,对于任何给定的方法调用,在flame图中,消耗最多CPU时间的callees首先出现。
    image
    1.3.3 使用自上而下和自下而上检查

    Top Down选项卡显示方法调用的列表,扩展方法节点显示其callees。下图显示了上面的图3中调用图的顶部向下图。图中的每个箭头都是从调用者到callee。

    下图所示,在顶部的down选项卡中扩展方法A的节点将显示它的callees、方法B和D。在此之后,扩展方法D的节点将暴露它的callees、方法B和C,等等。与火焰图选项卡类似,顶部向下的树聚合跟踪信息,用于共享相同调用堆栈的相同方法。也就是说,火焰图标签提供了顶部下标签的图形表示。

    Top Down选项卡提供以下信息,以帮助描述在每个方法调用上花费的CPU时间(在选定的时间段内,时间也代表线程总时间的百分比):

    Self:方法调用用于执行自己的代码而不是它的callees的时间量,如上面的图3所示。
    Children:方法调用花费的时间用于执行其被调用者,而不是其自己的代码,如图3中的方法D所示。
    Total:方法的Self和Children的时间的总和。这表示应用程序执行方法调用的总时间量,如图3所示的方法D。 
    

    在这里插入图片描述
    Bottom Up选项卡显示一个方法调用列表,扩展方法的节点显示其调用者。使用上图所示的例子中,下图提供了一个自下而上方法C .在自下而上的树中打开方法C的节点,显示每个独特的调用者,方法B和d .注意,虽然B两次调用C,B当扩大节点只出现一次自下而上方法C的树。再此之后,展开节点B显示其调用者方法A和D.

    image

    Bottom Up选项卡对于那些消耗最多(或最少)CPU时间的方法的排序方法很有用。您可以检查每个节点,以确定哪些调用者在调用这些方法上花费最多的CPU时间。与上面的树相比,底部树中每个方法的定时信息都是在每棵树的顶部(顶部节点)的方法。在记录期间,CPU时间也被表示为线程总时间的百分比。下表有助于解释如何解释顶级节点及其调用方方法(子节点)的定时信息。
    名称 Self Children Total
    自下而上树顶部的方法(顶层节点) 表示用于执行其自己的代码而不是其callees的方法的总时间。与上面的树相比,这个时间信息表示在记录期间对该方法的所有调用的总和。 表示用于执行callees而不是自己的代码的总时间。与上面的树相比,这个时间信息表示在记录期间对该方法的callees调用的所有调用的总和。 Self时间和Children的时间总和
    Caller 方法 (子节点) 表示调用者调用callee的总时间。使用上图中的底向上树作为例子,方法B的自我时间将等于每个方法C调用时的Self时间的总和。 表示调用者调用的callee的总子时间。在上图中使用底部向上的树为例,方法B的孩子时间将等于每个方法C调用时执行方法C的总和。 Self时间和Children的时间总和

    对于给定的记录,当profiler达到文件大小限制时,Android Studio停止收集新数据(但是这并没有停止记录)。这种情况在执行检测跟踪时通常会发生得更快,因为这种类型的跟踪会在较短的时间内收集更多的数据,而不是取样跟踪。如果将检查时间帧扩展到在到达限制后发生的记录期间,那么跟踪窗格中的计时数据不会发生变化(因为没有可用的新数据)。此外,当您只选择没有可用数据的记录的部分时,跟踪窗格将显示NaN用于计时信息。
    

    二、 内存分析器memory profiler

    内存分析器是Android Profiler中的一个组件,它可以帮助您识别内存泄漏和内存溢出,从而导致存根、冻结甚至应用程序崩溃。它显示了应用程序内存使用的实时图,让您捕获堆转储、强制垃圾收集和跟踪内存分配。

    要打开内存分析器和cpu检查器一样,就在隔壁。
    2.1 为什么使用内存分析器

    Android提供了一个托管内存环境——当它确定你的应用不再使用某些对象时,垃圾收集器会将未使用的内存释放回堆。在所有Android版本的某个点上,系统必须短暂地暂停代码。大多数时候,停顿是不可察觉的。但是,如果你的应用程序分配内存的速度快于系统收集的速度,你的应用程序可能会被延迟,而收集器释放了足够的内存来满足你的分配。延迟可能会导致应用程序跳过帧并导致明显的慢速。

    即使你的应用程序没有表现出缓慢,如果它泄露了内存,它仍然可以保留那个内存,即使它在后台。通过强制不必要的垃圾收集事件,这种行为可以降低系统内存性能的其他部分。最终,系统不得不杀死你的应用程序来回收内存。然后当用户返回到你的应用程序时,它必须重新启动。

    为了帮助防止这些问题,您应该使用内存分析器来执行以下操作:

    在可能导致性能问题的时间轴中寻找不良的内存分配模式
    Dump Java堆,以便在任何时间查看哪些对象正在使用内存。长时间的堆转储可以帮助识别内存泄漏。
    在正常和极端的用户交互过程中记录内存分配,以精确地确定您的代码在短时间内分配的对象或分配被泄漏的对象。
    

    有关可以减少应用程序内存使用的编程实践的信息,请参阅管理应用程序的内存。
    2.2 内存分析器概述

    image

    如上图所示,内存分析器的默认视图包括以下内容:

    ① 强制执行垃圾收集事件的按钮。
    ② 捕获堆转储的按钮。
    ③ 记录内存分配的按钮。
    ④ 放大时间线的按钮。
    ⑤ 跳转到实时内存数据的按钮。
    ⑥ 事件时间线显示活动状态、用户输入事件和屏幕旋转事件。
    ⑦ 内存使用时间表,其中包括以下内容: 
        每个内存类别使用多少内存的堆栈图,如左边的y轴和顶部的颜色键所示。
        虚线表示已分配对象的数量,如右侧y轴所示。
        每个垃圾收集事件的图标。
    

    但是,默认情况下并不是所有的分析数据都可见。如果您看到一条消息,说“高级分析不可用于所选进程”,则需要启用高级分析以查看以下内容:

    活动时间表 
    分配对象的数量 
    垃圾收集事件
    
    提示: 与之前的Android监控工具相比,新的内存分析器记录了你的内存使用情况,所以看起来你的内存使用量会更高。内存分析器监视一些额外的类别,这些类别增加了总数,但如果您只关心Java堆内存,那么“Java”的数字应该与上一个Android监视器的值类似。新的号码记录了从Zygote分派到应用程序的Java堆中的所有物理内存页面,这准确表示您的应用程序实际使用多少物理内存。
    

    2.3 记录内存分配

    查看堆转储时,查看分配了多少内存的快照很有用,它不会显示如何分配内存。为此,您需要记录内存分配。完成记录会话后,您可以看到以下记录的持续时间:

    分配了哪些对象以及它们使用了多少空间。
    在堆栈跟踪中分配每个对象的位置,其中包括线程。
    

    image

    要查看应用程序的内存分配,请单击内存分析器工具栏中的Record memory allocations。当它记录时,与你的应用程序进行交互,以引起内存溢出或内存泄漏。完成后,单击Stop recording。

    分配的对象列表出现在时间轴下面,按类名称分组,按堆计数排序,如上图所示。

    分配跟踪器最多记录65535个分配。如果您的记录超出此限制,则只有最近65535个分配将保存在该记录中。
    

    要检查分配记录,请按照下列步骤操作:

    浏览列表以查找具有非常大的堆计数且可能泄漏的对象,要帮助查找已知类,请单击类名列标题按字母顺序排序。然后单击一个类名,Instance View 窗格就会显示在右侧,显示该类的每个实例,如下图所示。
    在Instance View窗格中,单击一个实例。Call Stack选项卡显示在下面,显示了哪个实例被分配在哪个线程中。
    在Call Stack选项卡中,单击任意行可以在编辑器中跳转到该代码。
    

    在这里插入图片描述

    默认情况下,列表是按类名排列的。在列表的顶部,您可以使用右下拉菜单在列表之间切换:

    Arrange by class: 根据类名分配。
    Arrange by package:根据包名分配。
    Arrange by callstack: 根据调用堆栈排序
    

    2.4 捕获堆转储

    堆转储显示在捕获堆转储时应用程序正在使用内存的对象。特别是在扩展用户会话之后,堆转储可以通过显示仍然在内存中的对象来帮助识别内存泄漏。捕获堆转储后,可以查看以下内容:

    您的应用程序分配了哪些类型的对象,以及每个对象的数量。
    每个对象使用多少内存
    每个对象的引用被保留在你的代码中。
    调用堆栈,用于分配对象的位置(只有在记录分配时捕获堆转储)。
    

    图4

    要捕获堆转储,单击Memory-Profiler工具栏中的dump Java堆image。在转储堆时,Java内存的数量可能会暂时增加。这是正常的,因为堆转储发生在与应用程序相同的进程中,需要一些内存来收集数据。

    堆转储出现在内存时间轴下方,显示堆中的所有类类型,如上图所示。

    要检查你的堆,请按照下列步骤操作:

    浏览列表以查找具有异常大堆计数的对象,因为它可能会被泄露。为了帮助查找已知类,请单击类名列标题以按字母顺序排序。然后单击类名。实例视图窗格出现在右边,显示该类的每个实例,如下图所示。
    在Instance View窗格中,单击一个实例。 References选项卡显示在下面,显示对该对象的所有引用。或者单击实例名称旁边的箭头以查看其所有字段,然后单击字段名称以查看其所有引用。如果要查看某个字段的实例详细信息,请右键单击该字段,然后选择Go to Instance。
    在References选项卡中,如果识别可能是内存泄漏的引用,请右键单击它,然后选择Go to Instance.。这将从堆转储中选择相应的实例,显示您自己的实例数据。
    

    默认情况下,堆转储不会显示每个已分配对象的堆栈跟踪。要获取堆栈跟踪,您必须在单击转储Java堆之前开始记录内存分配。如果您这样做,您可以在实例视图中选择一个实例,并在References选项卡旁边看到Call Stack选项卡,如下图所示。但是,在开始记录分配之前,可能已经分配了一些对象,因此这些对象无法使用调用堆栈。包含一个调用堆栈的实例在图标上有一个stack标记image

    在这里插入图片描述

    在classes列表中,您可以看到以下信息:

    Heap Count: 堆中的实例数。
    Shallow Size: 此堆中所有实例的总大小(以字节为单位)。
    Retained Size: 这个类的所有实例(以字节为单位)保留的内存总大小。
    

    在类列表的顶部,可以使用左下拉列表在以下堆转储之间切换:

    Default heap: 当系统没有指定堆时。
    App heap: 应用程序分配内存的主堆。
    Image heap: 系统引导映像,包含在引导期间预加载的类。这里的分配保证永远不会移动或离开。
    Zygote heap: Android系统中分发应用程序进程的写时复制堆
    

    默认情况下,列表按保留大小列排序。您可以单击任何列标题来更改列表的排序方式。

    在Instance View中,每个实例包括以下内容:

    Depth:从任何GC根到所选实例的跳数最短。 
    Shallow Size:此实例的大小。 
    Retained Size:此实例支配的内存大小(根据支配者树)。
    

    三、 网络分析器(Network Profiler)

    网络分析器在时间轴上显示实时网络活动,显示发送和接收的数据,以及当前连接的数量。这让您可以检查应用程序如何和何时传输数据,并适当地优化底层代码。

    打开面板的步骤和上面的几乎一致。
    3.1 为什么要使用网络分析器

    当应用程序向网络发出请求时,设备必须使用耗电的移动或WiFi无线电来发送和接收数据包。接收器不仅使用电力传输数据,而且还使用额外的电源打开和保持唤醒。

    使用网络分析器,您可以查找频繁的、短的网络活动高峰,这意味着您的应用程序要求网络经常打开,或者长时间保持唤醒,以处理许多短的请求。这一模式表明,您可以通过批处理网络请求来优化应用程序,以改善电池性能,从而减少网络必须打开或接收数据的次数。这也使得网络可以切换到低功率模式,以节省电池的时间间隔。

    有关优化应用程序网络活动的技术的更多信息,请参阅 Reducing Network Battery Drain。
    3.2 网络分析器概述

    在窗口的顶部,您可以看到事件时间线和①无线电电源状态(high/low)和wi-fi。在时间轴上,您可以单击和拖动来选择②时间轴的一部分来检查流量。下面的③窗口显示在时间轴的选定部分中发送和接收的文件,包括文件名、大小、类型、状态和时间。您可以通过单击任何列标题来对列表进行排序。您还可以看到时间线所选部分的详细分解,显示每个文件被发送或接收的时间。

    单击连接的名称,查看所选文件发送或接收的详细信息。单击④选项卡查看响应数据、头信息或调用堆栈。

    image

    提示:您必须启用高级概要分析来选择时间轴的一部分来检查,查看发送和接收的文件的列表,或者查看所选文件发送或接收的详细信息。为了启用高级分析,请查看上一篇文章
    

    3.3 网络连接疑难解答

    如果网络分析器检测到流量值,但无法识别任何支持的网络请求。您将收到以下错误消息:”Network Profiling Data Unavailable: There is no information for the network traffic you’ve selected.”

    目前,网络分析器只支持HttpURLConnection和OkHttp库。如果您的应用程序使用另一个网络连接库,那么您可能无法在网络分析器中查看您的网络活动。如果您已经收到了这个错误消息,但是您的应用程序确实使用HttpURLConnection或OkHttp,请报告错误,以便我们可以调查这个问题。

    文章转自http://blog.csdn.net/niubitianping/article/details/72617864

    展开全文
  • Android Profiler讲解

    万次阅读 2018-01-03 10:45:42
    Android Profiler分为三大模块: cpu、内存 、网络。基本的使用在上一篇文章有讲到。这里详细说一下。 一、 CPU分析器CPU Profiler CPU分析器可帮助您实时检查应用程序的CPU使用情况和线程活动,并记录方法跟踪,...

    Android Profiler分为三大模块: cpu、内存 、网络。基本的使用在上一篇文章有讲到。这里详细说一下。

    一、 CPU分析器CPU Profiler

    CPU分析器可帮助您实时检查应用程序的CPU使用情况和线程活动,并记录方法跟踪,以便您可以优化和调试应用程序的代码。

    要打开CPU Profiler,请按照下列步骤操作:

    • 点击 View > Tool Windows > Android Profiler (还可以点击工具栏的image).
    • 从Android Profiler工具栏中选择要配置的设备和应用程序进程(如果您已通过USB连接设备但未看到它,请确保已启用USB调试)
    • 单击CPU时间轴中的任意位置打开CPU Profiler。

    1.1 为什么要优化CPU的使用

    优化CPU使用率有许多优点,例如提供更快更流畅的用户体验,并保持设备电池寿命。它还可以帮助您的应用程序在各种较新旧的设备上运行良好,您可以使用CPU分析器在与应用程序交互时监视CPU使用情况和线程活动,但是,有关应用程序执行代码的更详细信息,应记录并检查方法跟踪。

    对于应用程序进程中的每个线程,您可以找到在一段时间内执行哪些方法以及每个方法在执行期间消耗的CPU资源。您还可以使用方法跟踪来识别调用者和被调用者,调用者是一种调用另一种方法的方法,被调用方是另一种方法调用的方法。您可以使用此信息来确定哪些方法太频繁地调用特定资源繁重的任务,就可以尝试优化应用程序的代码以避免不必要的工作。

    如果要收集详细的系统级数据,帮助您检查本地系统进程并解决由丢帧引起的UI jank,则应使用Systrace。或者,如果要导出使用Debug捕获的.trace文件,则应使用Traceview

    1.2 CPU Profiler概述

    当您打开CPU分析器时,它会立即开始显示应用程序的CPU使用情况和线程活动。你会看到类似于下图的内容 
    image

    如上图所示,CPU Profiler的默认视图包括以下内容:

    • ①Event timeline: 显示您的应用程序在其生命周期中转换不同状态的活动,并指示用户与设备的交互,包括屏幕旋转事件。要了解有关事件时间轴的更多信息,包括如何启用它,请阅读我上一篇文章说到的启用高级分析
    • ②CPU timeline: 显示您的应用程序的实时CPU使用率(占总可用CPU的百分比)以及应用程序使用的线程总数,时间轴还显示其他进程的CPU使用情况(如系统进程或其他应用程序),所以您可以将其与应用程序的使用情况进行比较。您可以通过沿着时间轴的水平轴移动鼠标来检查历史CPU使用率数据。
    • ③Thread activity timeline: 列出属于您的应用程序进程的每个线程,并使用不同的颜色在时间轴上指示其活动。记录方法跟踪后,可以从此时间轴中选择一个线程,在跟踪窗格中检查其数据。 
      • 绿色: 线程处于活动状态或准备好使用CPU。也就是说,它处于”运行”或”可运行”状态。
      • 黄色: 线程处于活动状态,但是在完成其工作之前,它正在等待I / O操作(如文件或网络I / O)。
      • 灰色: 线程正在睡眠,不会消耗任何CPU时间,当线程需要访问尚未可用的资源时,有时会发生这种情况。要么线程进入自愿性睡眠,要么内核使线程休眠,直到所需的资源可用。
    • ④Tracing type:允许您选择以下选项之一来确定分析器如何记录方法跟踪。 
      • Sampled: 在应用程序执行期间,您可以频繁地捕获应用程序的调用堆栈。profiler将捕获的数据集进行比较,以获取关于应用程序代码执行的时间和资源使用信息。基于sampled跟踪的一个固有问题是,如果您的应用程序在捕获调用堆栈并在下一次捕获之前退出该方法,那么该方法调用不会被分析器记录。如果您对具有这样短生命周期的跟踪方法感兴趣,您应该使用工具跟踪。
      • Instrumented: 在您的应用程序运行时记录每个方法调用的开始和结束时的时间戳。收集时间戳并与生成方法跟踪数据进行比较,包括时间信息和CPU使用。请注意,对每种方法进行检测的开销会影响运行时性能,并可能影响性能分析,因此对于具有相对较短的生命周期的方法来说,这更加值得注意。此外,如果您的应用程序在短时间内执行大量的方法,profiler可能很快超过它的文件大小限制,进而不能记录任何进一步的跟踪数据。
    • ⑤Record button:开始和停止记录方法跟踪。要了解更多信息,请继续看下去

      提示:profiler还报告了Android Studio和Android平台在你的应用程序过程中添加的线程的CPU使用情况,如JDWP、Profile Saver、Studio:VMStats、Studio:Perfa和Studio:Heartbeat(尽管,在线程活动时间线中显示的确切名称可能会有所不同)。这意味着您的应用程序在CPU时间轴上的CPU使用率也会报告这些线程使用的CPU时间。您可以在线程活动时间表中看到这些线程,并监视它们的活动。(但是,由于profiler线程执行native代码,因此无法为它们记录方法跟踪数据。)Android Studio会报告这些数据,这样你就可以很容易地识别出线程活动和CPU使用实际上是由你的应用程序代码引起的。

    1.3 记录和检查方法跟踪

    要开始记录方法跟踪,从下拉菜单中选择SampledInstrumented类型,然后单击Record开始进行记录,完成后点击Stop recording停止记录。profiler自动选择记录的时间帧,并在方法跟踪窗格中显示它的跟踪信息,如下图所示。如果要检查不同线程的方法跟踪,只需从线程活动时间轴中选择它。 
    image

    • ① Selected time frame: 在跟踪窗格中检查的记录时间框架的部分。当您第一次记录一个方法跟踪时,CPU分析器将自动选择您在CPU时间线中记录的整个长度。如果要检查仅记录的时间帧的一部分的方法跟踪数据,您可以单击并拖动高亮显示区域的边缘来修改它的长度。
    • ②Timestamp: 表示记录方法跟踪的开始和结束时间(相对于profiler开始从设备收集CPU使用信息时)。你可以点击时间戳来自动选择整个记录作为你选定的时间框架——如果你有多个你想要转换的记录,这是非常有用的。
    • ③Trace pane:显示您所选择的时间框架和线程的方法跟踪数据。仅当您记录至少一个方法跟踪后,此窗格才会显示。在此窗格中,您可以选择如何查看每个堆栈跟踪(使用跟踪选项卡)以及如何测量执行时间(使用时间参考下拉菜单)。
    • ④: 选择显示为Top Down tree, Bottom Up tree, Call Chart, or Flame Chart这些类型的图。您可以在下面的部分中了解有关每个跟踪窗格选项卡的更多信息。
    • 从下拉菜单中选择以下选项之一,以确定如何测量每个方法调用的时序信息: 
      • Wall clock time: 表示实际经过时间。
      • Thread time:计时信息表示实际的消耗时间减去不消耗CPU资源的那段时间的任何部分。对于任何给定的方法,它的线程时间总是小于或等于它的时钟时间。使用线程时间让您更好地了解给定方法所消耗的线程实际CPU使用量

    1.3.1 使用Call Chart选项卡检查跟踪

    Call Chart选项卡提供一个方法跟踪的图形表示,其中一个方法调用(或调用者)的周期和时间在水平轴上表示,而它的callees则显示在垂直轴上。对系统api的方法调用以橙色显示,调用您的应用程序自己的方法以绿色显示,方法调用第三方api(包括java语言api)以蓝色显示。下面的图显示了一个示例调用图,并说明了给定方法的自时间、子时间和总时间的概念。关于如何使用自上而下和自下而上检查痕迹的部分,请继续看下去

    图3

    提示: 如果想要跳转到方法的源代码,请右键单击该方法,然后选择Jump to Source。这可以从任何窗格选项卡工作。

    1.3.2 使用火焰图表(Flame Chart)选项卡检查痕迹

    火焰图选项卡提供了一个反向调用图表,聚合了相同的调用堆栈。也就是说,收集相同的调用序列的相同方法被收集并表示为火焰图中的一个较长的栏(而不是将它们显示为多个更短的条,如调用图所示)。这样就更容易看出哪些方法消耗的时间最多。然而,这也意味着横轴不再表示时间轴,相反,它表示每个方法执行的相对时间。

    为了帮助说明这个概念,考虑下面图4中的调用图表。注意,方法D对B(B1、B2和B3)进行多次调用,其中一些调用B对C(C1和C3)进行调用。

    image

    因为B1、B2和B3共享相同的序列调用者(A→D→B)聚合,如下所示。同样,C1和C3聚合,因为它们共享相同的序列调用者(A→D→B→C)注意不包括C2,因为它有不同的调用者序列(A→D→C)。

    image

    聚合方法调用用于创建flame 图,如下图所示。注意,对于任何给定的方法调用,在flame图中,消耗最多CPU时间的callees首先出现。 
    image

    1.3.3 使用自上而下和自下而上检查

    Top Down选项卡显示方法调用的列表,扩展方法节点显示其callees。下图显示了上面的图3中调用图的顶部向下图。图中的每个箭头都是从调用者到callee。

    下图所示,在顶部的down选项卡中扩展方法A的节点将显示它的callees、方法B和D。在此之后,扩展方法D的节点将暴露它的callees、方法B和C,等等。与火焰图选项卡类似,顶部向下的树聚合跟踪信息,用于共享相同调用堆栈的相同方法。也就是说,火焰图标签提供了顶部下标签的图形表示。

    Top Down选项卡提供以下信息,以帮助描述在每个方法调用上花费的CPU时间(在选定的时间段内,时间也代表线程总时间的百分比):

    • Self:方法调用用于执行自己的代码而不是它的callees的时间量,如上面的图3所示。
    • Children:方法调用花费的时间用于执行其被调用者,而不是其自己的代码,如图3中的方法D所示。
    • Total:方法的Self和Children的时间的总和。这表示应用程序执行方法调用的总时间量,如图3所示的方法D。 
      image

    Bottom Up选项卡显示一个方法调用列表,扩展方法的节点显示其调用者。使用上图所示的例子中,下图提供了一个自下而上方法C .在自下而上的树中打开方法C的节点,显示每个独特的调用者,方法B和d .注意,虽然B两次调用C,B当扩大节点只出现一次自下而上方法C的树。再此之后,展开节点B显示其调用者方法A和D.

    image

    Bottom Up选项卡对于那些消耗最多(或最少)CPU时间的方法的排序方法很有用。您可以检查每个节点,以确定哪些调用者在调用这些方法上花费最多的CPU时间。与上面的树相比,底部树中每个方法的定时信息都是在每棵树的顶部(顶部节点)的方法。在记录期间,CPU时间也被表示为线程总时间的百分比。下表有助于解释如何解释顶级节点及其调用方方法(子节点)的定时信息。

    名称 Self Children Total
    自下而上树顶部的方法(顶层节点) 表示用于执行其自己的代码而不是其callees的方法的总时间。与上面的树相比,这个时间信息表示在记录期间对该方法的所有调用的总和。 表示用于执行callees而不是自己的代码的总时间。与上面的树相比,这个时间信息表示在记录期间对该方法的callees调用的所有调用的总和。 Self时间和Children的时间总和
    Caller 方法 (子节点) 表示调用者调用callee的总时间。使用上图中的底向上树作为例子,方法B的自我时间将等于每个方法C调用时的Self时间的总和。 表示调用者调用的callee的总子时间。在上图中使用底部向上的树为例,方法B的孩子时间将等于每个方法C调用时执行方法C的总和。 Self时间和Children的时间总和

    对于给定的记录,当profiler达到文件大小限制时,Android Studio停止收集新数据(但是这并没有停止记录)。这种情况在执行检测跟踪时通常会发生得更快,因为这种类型的跟踪会在较短的时间内收集更多的数据,而不是取样跟踪。如果将检查时间帧扩展到在到达限制后发生的记录期间,那么跟踪窗格中的计时数据不会发生变化(因为没有可用的新数据)。此外,当您只选择没有可用数据的记录的部分时,跟踪窗格将显示NaN用于计时信息。

    二、 内存分析器memory profiler

    内存分析器是Android Profiler中的一个组件,它可以帮助您识别内存泄漏和内存溢出,从而导致存根、冻结甚至应用程序崩溃。它显示了应用程序内存使用的实时图,让您捕获堆转储、强制垃圾收集和跟踪内存分配。

    要打开内存分析器和cpu检查器一样,就在隔壁。

    2.1 为什么使用内存分析器

    Android提供了一个托管内存环境——当它确定你的应用不再使用某些对象时,垃圾收集器会将未使用的内存释放回堆。在所有Android版本的某个点上,系统必须短暂地暂停代码。大多数时候,停顿是不可察觉的。但是,如果你的应用程序分配内存的速度快于系统收集的速度,你的应用程序可能会被延迟,而收集器释放了足够的内存来满足你的分配。延迟可能会导致应用程序跳过帧并导致明显的慢速。

    即使你的应用程序没有表现出缓慢,如果它泄露了内存,它仍然可以保留那个内存,即使它在后台。通过强制不必要的垃圾收集事件,这种行为可以降低系统内存性能的其他部分。最终,系统不得不杀死你的应用程序来回收内存。然后当用户返回到你的应用程序时,它必须重新启动。

    为了帮助防止这些问题,您应该使用内存分析器来执行以下操作:

    • 在可能导致性能问题的时间轴中寻找不良的内存分配模式
    • Dump Java堆,以便在任何时间查看哪些对象正在使用内存。长时间的堆转储可以帮助识别内存泄漏。
    • 在正常和极端的用户交互过程中记录内存分配,以精确地确定您的代码在短时间内分配的对象或分配被泄漏的对象。

    有关可以减少应用程序内存使用的编程实践的信息,请参阅管理应用程序的内存

    2.2 内存分析器概述

    image

    如上图所示,内存分析器的默认视图包括以下内容:

    • ① 强制执行垃圾收集事件的按钮。
    • ② 捕获堆转储的按钮。
    • ③ 记录内存分配的按钮。
    • ④ 放大时间线的按钮。
    • ⑤ 跳转到实时内存数据的按钮。
    • ⑥ 事件时间线显示活动状态、用户输入事件和屏幕旋转事件。
    • ⑦ 内存使用时间表,其中包括以下内容: 
      • 每个内存类别使用多少内存的堆栈图,如左边的y轴和顶部的颜色键所示。
      • 虚线表示已分配对象的数量,如右侧y轴所示。
      • 每个垃圾收集事件的图标。

    但是,默认情况下并不是所有的分析数据都可见。如果您看到一条消息,说“高级分析不可用于所选进程”,则需要启用高级分析以查看以下内容:

    • 活动时间表 
    • 分配对象的数量 
    • 垃圾收集事件

    提示: 与之前的Android监控工具相比,新的内存分析器记录了你的内存使用情况,所以看起来你的内存使用量会更高。内存分析器监视一些额外的类别,这些类别增加了总数,但如果您只关心Java堆内存,那么“Java”的数字应该与上一个Android监视器的值类似。新的号码记录了从Zygote分派到应用程序的Java堆中的所有物理内存页面,这准确表示您的应用程序实际使用多少物理内存。

    2.3 记录内存分配

    查看堆转储时,查看分配了多少内存的快照很有用,它不会显示如何分配内存。为此,您需要记录内存分配。完成记录会话后,您可以看到以下记录的持续时间:

    • 分配了哪些对象以及它们使用了多少空间。
    • 在堆栈跟踪中分配每个对象的位置,其中包括线程。

    image

    要查看应用程序的内存分配,请单击内存分析器工具栏中的Record memory allocations。当它记录时,与你的应用程序进行交互,以引起内存溢出或内存泄漏。完成后,单击Stop recording

    分配的对象列表出现在时间轴下面,按类名称分组,按堆计数排序,如上图所示。

    分配跟踪器最多记录65535个分配。如果您的记录超出此限制,则只有最近65535个分配将保存在该记录中。

    要检查分配记录,请按照下列步骤操作:

    • 浏览列表以查找具有非常大的堆计数且可能泄漏的对象,要帮助查找已知类,请单击类名列标题按字母顺序排序。然后单击一个类名,Instance View 窗格就会显示在右侧,显示该类的每个实例,如下图所示。
    • Instance View窗格中,单击一个实例。Call Stack选项卡显示在下面,显示了哪个实例被分配在哪个线程中。
    • Call Stack选项卡中,单击任意行可以在编辑器中跳转到该代码。

    image

    默认情况下,列表是按类名排列的。在列表的顶部,您可以使用右下拉菜单在列表之间切换:

    • Arrange by class: 根据类名分配。
    • Arrange by package:根据包名分配。
    • Arrange by callstack: 根据调用堆栈排序

    2.4 捕获堆转储

    堆转储显示在捕获堆转储时应用程序正在使用内存的对象。特别是在扩展用户会话之后,堆转储可以通过显示仍然在内存中的对象来帮助识别内存泄漏。捕获堆转储后,可以查看以下内容:

    • 您的应用程序分配了哪些类型的对象,以及每个对象的数量。
    • 每个对象使用多少内存
    • 每个对象的引用被保留在你的代码中。
    • 调用堆栈,用于分配对象的位置(只有在记录分配时捕获堆转储)。

    图4

    要捕获堆转储,单击Memory-Profiler工具栏中的dump Java堆image。在转储堆时,Java内存的数量可能会暂时增加。这是正常的,因为堆转储发生在与应用程序相同的进程中,需要一些内存来收集数据。

    堆转储出现在内存时间轴下方,显示堆中的所有类类型,如上图所示。

    要检查你的堆,请按照下列步骤操作:

    • 浏览列表以查找具有异常大堆计数的对象,因为它可能会被泄露。为了帮助查找已知类,请单击类名列标题以按字母顺序排序。然后单击类名。实例视图窗格出现在右边,显示该类的每个实例,如下图所示。
    • Instance View窗格中,单击一个实例。 References选项卡显示在下面,显示对该对象的所有引用。或者单击实例名称旁边的箭头以查看其所有字段,然后单击字段名称以查看其所有引用。如果要查看某个字段的实例详细信息,请右键单击该字段,然后选择Go to Instance
    • References选项卡中,如果识别可能是内存泄漏的引用,请右键单击它,然后选择Go to Instance.。这将从堆转储中选择相应的实例,显示您自己的实例数据。

    默认情况下,堆转储不会显示每个已分配对象的堆栈跟踪。要获取堆栈跟踪,您必须在单击转储Java堆之前开始记录内存分配。如果您这样做,您可以在实例视图中选择一个实例,并在References选项卡旁边看到Call Stack选项卡,如下图所示。但是,在开始记录分配之前,可能已经分配了一些对象,因此这些对象无法使用调用堆栈。包含一个调用堆栈的实例在图标上有一个stack标记image

    image

    在classes列表中,您可以看到以下信息:

    • Heap Count: 堆中的实例数。
    • Shallow Size: 此堆中所有实例的总大小(以字节为单位)。
    • Retained Size: 这个类的所有实例(以字节为单位)保留的内存总大小。

    在类列表的顶部,可以使用左下拉列表在以下堆转储之间切换:

    • Default heap: 当系统没有指定堆时。
    • App heap: 应用程序分配内存的主堆。
    • Image heap: 系统引导映像,包含在引导期间预加载的类。这里的分配保证永远不会移动或离开。
    • Zygote heap: Android系统中分发应用程序进程的写时复制堆

    默认情况下,列表按保留大小列排序。您可以单击任何列标题来更改列表的排序方式。

    在Instance View中,每个实例包括以下内容:

    • Depth:从任何GC根到所选实例的跳数最短。 
    • Shallow Size:此实例的大小。 
    • Retained Size:此实例支配的内存大小(根据支配者树)。

    三、 网络分析器(Network Profiler)

    网络分析器在时间轴上显示实时网络活动,显示发送和接收的数据,以及当前连接的数量。这让您可以检查应用程序如何和何时传输数据,并适当地优化底层代码。

    打开面板的步骤和上面的几乎一致。

    3.1 为什么要使用网络分析器

    当应用程序向网络发出请求时,设备必须使用耗电的移动或WiFi无线电来发送和接收数据包。接收器不仅使用电力传输数据,而且还使用额外的电源打开和保持唤醒。

    使用网络分析器,您可以查找频繁的、短的网络活动高峰,这意味着您的应用程序要求网络经常打开,或者长时间保持唤醒,以处理许多短的请求。这一模式表明,您可以通过批处理网络请求来优化应用程序,以改善电池性能,从而减少网络必须打开或接收数据的次数。这也使得网络可以切换到低功率模式,以节省电池的时间间隔。

    有关优化应用程序网络活动的技术的更多信息,请参阅 Reducing Network Battery Drain

    3.2 网络分析器概述

    在窗口的顶部,您可以看到事件时间线和①无线电电源状态(high/low)和wi-fi。在时间轴上,您可以单击和拖动来选择②时间轴的一部分来检查流量。下面的③窗口显示在时间轴的选定部分中发送和接收的文件,包括文件名、大小、类型、状态和时间。您可以通过单击任何列标题来对列表进行排序。您还可以看到时间线所选部分的详细分解,显示每个文件被发送或接收的时间。

    单击连接的名称,查看所选文件发送或接收的详细信息。单击④选项卡查看响应数据、头信息或调用堆栈。

    image

    提示:您必须启用高级概要分析来选择时间轴的一部分来检查,查看发送和接收的文件的列表,或者查看所选文件发送或接收的详细信息。为了启用高级分析,请查看上一篇文章

    3.3 网络连接疑难解答

    如果网络分析器检测到流量值,但无法识别任何支持的网络请求。您将收到以下错误消息:”Network Profiling Data Unavailable: There is no information for the network traffic you’ve selected.”

    目前,网络分析器只支持HttpURLConnection和OkHttp库。如果您的应用程序使用另一个网络连接库,那么您可能无法在网络分析器中查看您的网络活动。如果您已经收到了这个错误消息,但是您的应用程序确实使用HttpURLConnection或OkHttp,请报告错误,以便我们可以调查这个问题。

    文章转自http://blog.csdn.net/niubitianping/article/details/72617864


    展开全文
  • Snapdragon Profiler工具简介

    千次阅读 2019-04-16 16:18:07
    大家好,今天小白给大家简单介绍下,Snapdragon Profiler工具的简单用法,欢迎一起交流学习。 一、什么是Snapdragon Profiler? Snapdragon Profiler可以分析在Windows,Mac和Linux平台上运行的软件。它通过USB...

    大家好,今天小白给大家简单介绍下,Snapdragon Profiler工具的简单用法,欢迎一起交流学习。

    一、什么是Snapdragon Profiler?

    Snapdragon Profiler可以分析在Windows,Mac和Linux平台上运行的软件。它通过USB连接由Snapdragon处理器驱动的Android设备。Snapdragon Profiler允许开发人员分析CPU,GPU,DSP,内存,电源,散热和网络数据,以便他们找到并修复性能瓶颈。

    作用:

    1、实时视图可以轻松关联时间轴上的系统资源使用情况;
      分析CPU,GPU,DSP *,内存,电源,散热和网络数据指标;
      从22个类别中的150多种不同硬件性能计数器中进行选择;
    2、跟踪捕获模式允许您在时间线上可视化内核和系统事件,以分析CPU,GPU和DSP上的低级系统事件;
      查看CPU调度和GPU阶段数据,以查看应用程序花费时间的位置;
    3、Snapshot Capture ***模式允许您从任何OpenGL ES应用程序捕获和调试渲染帧;
      逐步并重放渲染帧绘制逐个调用调用;
      查看和编辑着色器并在设备上预览结果;
      查看和调试像素历史记录;
      捕获并查看每个绘制调用的GPU指标;
    4、GPU API:OpenGL ES 3.1,OpenCL 2.1和Vulkan 1.0 
      需要Snapdragon 820(或更高版本)处理器
      需要Android N(或带有支持Vulkan的图形驱动程序的Android 6.0设备)
      需要Snapdragon 805(或更高版本)处理器和Android 6.0(或更高版本)

    二、Snapdragon Profiler工具获取和安装?

    1、可以点击此处获取该款工具。

    2、在Windows上:在主机上运行安装程序可执行文件。安装程序将引导您完成所需的步骤,并提示您找不到任何无法找到的依赖项,建议使用管理员权限运行安装程序。(安装路径:Windows上,Snapdragon Profiler将被安装到“C:\ Program Files(x86)\ Qualcomm \ Snapdragon Profiler”。)

    三、Snapdragon Profiler有哪些系统要求?

    运行Windows 7,Windows 8.x或Windows 10的PC,运行OS X Yosemite(10.10)或更高版本的Mac,或运行Ubuntu Linux 14.04(Trusty)或更高版本的PC。
    Snapdragon Profiler使用Mono框架和GTK#。如果尚未安装,则可以点击此处安装依赖项
    运行Android 5.0(或更高版本)的移动设备,由Qualcomm Snapdragon处理器提供支持。

    四、Snapdragon Profiler使用方法?

    1、将Android设备连接到安装了Snapdragon Profiler的计算机。

    2、选择Android设置>开发者选项以确保设备具有开发人员选项启用。

      注意:如果看不到“开发者选项”,请转到Android设置>关于手机>软件信息,并持续点击内部版本号,直到启用开发者选项。 回去“Android设置”的一步,确认“开发者选项”菜单项可用。

    3、在Windows PC(或OS X或Linux上的终端)上,打开命令提示符并运行adb devices,用于确认设备已被识别的设备(显示在附加的设备列表中)。

    4、若设备已经可以被识别,双击启动Snapdragon Profiler。(如果桌面没有该图标,可以在C:\ Program Files(x86)\ Qualcomm \ Snapdragon Profiler目录下去启动。)

    5、启动成功后,点击file--->connect或者Connect to a device,如下界面: 

    6、点击连接之后,会检测到相应的设备,如下图:                             

    7、然后点击connect,连接成功后,如下图:

    连接成功后,即可以使用Snapdragon Profiler三种模式之一:实时,跟踪捕获或快照捕获。

    8、选择一种模式,如 Realtime,可以实时追踪一些实时的系统指标,如:CPU、GPU、DSP、Memory, Network, Power, and Thermal等,如下图:

    9、双击system指标中的某项,就可以在右侧栏中看到相应的指标数据,如下图中的CPU 0 Frequency。

    10、也可以在应用程栏选择一个应用程序,来查看该应用程序的某项指标,如FPS

    11、也可以同时查看system和process的指标。

    其他的两种工作模式(跟踪捕获和快照捕获)使用方法也比较简单,就不在此赘述了。

    五、总结

    该篇主要简单介绍了Snapdragon Profiler工具的一些功能特点、使用范围及使用方法等,欢迎一起交流学习。

    展开全文
  • 在发生ANR生启用android stuiod profiler, 调用CPUSample Java Methods 开启cpu监测一段时间。 结果如下: 由上图可以看到,main线程中程序一直在执行 查看主线程方法调用情况 从上面两个图可以...

    案例:个股详情界面失去焦点后发生ANR,必现。

     

    在发生ANR生启用android stuiod profiler, 调用CPU Sample Java Methods  开启cpu 监测一段时间。

    结果如下:

    由上图可以看到,main 线程中程序一直在执行

    查看主线程方法调用情况 

     

     

     

    从上面两个图可以看出来, 主线程 markState() 方法执行占用CPU高达99.60%,耗时长,则表示一定是此处造成的ANR。

    从调用顺序可以看出,是由于StockDataInfoActivity.onStop()方法执行后造成的,这与造成的ANR现象一致,是个股详情界面失去焦点时发生ANR.

    markState()方法是Fragment的源码,启动debug模式, 最终发现是该方法循环递归造成的。

     

    原因:项目tragetSdkVersion为28, fragmnet的V4包是28.0.0,在个股详情界面SherlockFragmentActivity 所加载的StockDataInfoFragment所继承的LazyLoadFragment中,在onStop onResume onPasue等生命周期方法中调用了getLifecycler().handleLifecyclerEvent()方法。

    @Override
    public void onStop() {
        super.onStop();
        handleLifecycleEvent(Lifecycle.Event.ON_STOP);
    }
    .......
    
    
    private void handleLifecycleEvent(Lifecycle.Event event) {
        if (mLifecycleRegistry != null) {
            mLifecycleRegistry.handleLifecycleEvent(event);
        }
    }

     

    在26.0.0版本及之前的V4包中的fragment 没有getLifecycle()方法,如果需要使用LifecycleRegistery,则需要自己重写生命周期方法并发送相应的事件;而在26.0.1及以后,源码已经处理了,此时如果在业务代码中,再去发送这些事件,就会导致V4 fragment源码中处理生命周期事件时发生递归,造成死循环。

     

    解决方法:删除 mLifecycleRegistry.handleLifecycleEvent(event) 相关代码即可。

     

    希望对大家有用!!!

     

     

     

     

     

     

     

    展开全文
  • Android Profiler分析(一)概述

    千次阅读 2020-06-23 20:30:34
    Android Profiler的使用流程 点击 View > Tool Windows > Android Profiler 点击工具栏的图标即可打开 按钮①的位置选择设备,通过按钮②的位置选择想要的app进程,工具最底部显示了一个时间轴,其中包含了...
  • Intellij IDEA集成JProfiler性能分析神器

    万次阅读 多人点赞 2018-02-05 19:01:29
    环境 JProfiler 17.1.3(IDEA插件) JProfiler 9.2(可执行软件) IntelliJ IDEA 2017.2.5 下载 下载JProfiler(IDEA)插件 ...在IDEA上直接下载Settings–plugins–Browse repositories ...
  • Unity3D为我们提供了一个强大的性能分析工具Profiler。今天我们就使用Profiler来详细分析一下官方例子AngryBots的内存使用信息数据。  首先打开Profiler选择Memory选项,在游戏运行的某一帧查看Detailed选项数据...
  • CPU Profiler 首先来说,CPU Profiler并不是专门用于处理页面卡顿掉帧的,准确说:CPU Profiler是用来查看每个线程,在某段一段时间内执行了哪些函数,以及在其执行期间每个函数消耗的 CPU 资源。 专门针对卡顿掉帧...
  • 性能测试工具CPU profiler(gperftools)的使用心得

    万次阅读 热门讨论 2018-11-07 12:19:12
    最近因为要研究一个算法的优化问题,需要找一款工具对程序进行性能分析,于是想到了google的性能分析工具gperftools的CPU profiler,本文记录CPU profiler的使用心得。 编译安装gperftools gperftools是一个工具包...
  •   多数情况下是指用来测定你所编写的应用程序的运行...  在计算机中的profiler/profile,多数情况下是指用来测定你所编写的应用程序的运行效率的一个程序,它可以列出你程序中每个函数运行了多长时间等参数。 ...
  • Jprofiler简介

    千次阅读 2019-02-27 15:41:00
    概述 JProfiler是用于分析J2EE软件性能瓶颈并能准确定位到Java类或者方法有效解决性能问题的主流工具,它通常需要与性能测试工具如:LoadRunner配合使用,因为往往只有当系统处于压力状态下才能反映出性能问题。...
  • i1Profiler_1.8.3的安装包及和谐文件。 仅供学习,禁止商用。
  • SQL Profiler下载

    2020-07-30 17:06:48
    SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询; 在后台收集查询信息; 分析性能; 诊断像死锁之类的问题; 调试T-SQL语句; 模拟重放SQL Server活动; 也可以使用...
  • 对于已经存在的代码,找出影响性能的问题点至关重要,Oracle提供的DBMS_PROFILER包可以方便地发现其瓶颈所在。 安装DBMS_PROFILER包 在使用DBMS_PROFILER之前,要以管理员身份进入数据库系统进行安装。 1. 使用...
  • 今天在学习过程中想使用profiler功能,但是发现它一直处于加载状态: 后面在网上找到了针对本人的解决方案: 将模拟机换成API版本更高的(此前使用的模拟机API是16,换成API26的就能正常打开profiler了: 我的...
  • studio64.exe.vmoptions 文件中添加代码 -Dfile.encoding=UTF-8
  • Unity3D Profiler调试

    千次阅读 2014-11-22 12:08:31
    Unity3D Profiler调试   一安卓 Profiler调试 二iOS Profiler调试 三注意事项  一安卓Profiler调试 安卓Profiler调试分4步 1 出包 2 装包 3 记手机ip 4 连接Profiler   1.出包 Build的时候,...
  • ANTS Performance Profiler 破解使用

    千次阅读 2013-01-04 10:13:17
    http://blog.csdn.net/wangjia184/article/details/7746089
  • Unity Profiler使用教程

    千次阅读 2018-07-25 20:14:37
    Autoconnect Profiler Script Debugging 2、Unity工程切换到Android平台,打开Profiler. unity编辑器设置为 Android 平台,如上图所示(这里被坑了有点久,一直在 PC平台 上写代码,忘了设置这个导致一直连不...
  • CUDA之NVIDIA Visual Profiler

    千次阅读 2018-03-19 15:47:17
    遇到的第一个问题:/home/wolf/Desktop/cuda profiler/test.exe: 1: /home/wolf/Desktop/cuda profiler/test.exe: MZ����@���: not found/home/wolf/Desktop/cuda profiler/test.exe: 2: /home/wolf/Desktop/...
1 2 3 4 5 ... 20
收藏数 47,017
精华内容 18,806
关键字:

profiler