【软件构造】8.4 动态性能分析方法与工具

    xiaoxiao2022-07-14  159

    1.动态程序分析 Dynamic Program Analysis

    动态程序分析:根据程序的一次或多次执行的过程与结果,分析代码在时空性能方面所展现出的性质 静态分析:使用抽象的输入值 动态分析:使用具体的输入值 为使动态分析有效,目标程序必须执行足够多次,以观察到完整的、不同的执行行为。 通过分析代码覆盖度,确认动态分析是否已经足够。 要尽可能小的影响程序原本的执行,否则性能测量不准确。 例一:程序热点分析( Hot Spots ) 每个程序实体(语句、分支、路径、方法等)的执行概率/频度是多少? 例二:路径分析 一条控制流的执行概率/频度是多少?

    2.程序性能分析(Program Profiling):概念与方法

    性能分析(Profiling)是一种动态程序分析的形式,衡量程序的时空复杂度,特定指令的使用,或函数调用的频度,时长(hotspots)等。 通过性能分析可以了解: 1.程序的运行时间花在了哪里?(每个方法上花多久时间?程序的哪一部分更慢?) 2.程序流:哪个函数调用了哪个函数,以及其频率 3.每种类型创建类多少个对象?内存消耗是多少?

    2.1 分析器 Profiler

    程序性能分析通过用profiler测量程序源代码或二进制可执行文件实现。 使用程序运行中收集到的信息,可以用在太大或太复杂,难以通过阅读代码观察的程序。 Profiler的输出:

    所观察到的程序执行事件的统计结果 测量规模与代码多少成线性关系事件流 并行程序依赖于事件的时间关系,测量规模与指令路径长度成线性关系,可以设定起点和终点来减少输出。实时或周期性的获取/展示程序运行过程中的数据 类型:Flat profilerCall-graph profilerInput-sensitive profiler

    2.2 分析方法

    2.2.1 代码注入/代码插入 Insertion/Instrumentation

    通过在源代码中加入指令来收集所需的性能数据 可以在源代码中注入或在目标代码中注入 例:System.out.println(System.getCurrentTimeMillis());

    优点缺点准确,可以跨平台使用需要修改程序;注入的代码可能影响测试结果

    2.2.2 采样 Sampling

    采样:外部观察者周期性监控被测程序,存储各时刻的快照 基于收集到的数据,分析程序当时所处的状态,分析性能

    优点缺点不需要修改程序需要在采样频率和准确度之间折中;可能漏掉“小”的方法; 难以监控内存使用情况

    2.2.3 借助于虚拟机获取程序性能数据Instrumented virtual machine

    利用虚拟机进行性能监控,所有JVM执行的指令都被记录下来

    优点缺点非常准确,可监控时空两方面的性能与VM绑定,不同VM需要提供不同的测量工具

    3.Java中的性能分析工具

    3.1 基于命令行的性能分析工具

    jstat:获取JVM的heap使用和GC的性能统计数据

    jmap:输出内存中的对象分布情况

    不加参数:打印加载的共享对象的列表jmap -dump:format=b,file=filename:以二进制形式导出heap dump到目标文件jmap-heap:获取堆的信息,包括GC算法,堆的配置,堆的使用信息jmap-histo:获取类的堆使用情况jmap -clstats :(??)

    jhat:导出heap dump,浏览/查询其中的对象分布情况

    支持预设的查询语句和OQL heap dump:堆转储文件,是一个Java进程在某个时间点上的内存快照,存储在二进制文件HPROF中

    jmap -dump:获取运行时的heap dumpjcmd GC.heap_dump:创建heap dumpjconsole:运行时通过HotSpotDiagnosticMXBean获取heap dump指定了-XX:+HeapDumpOnOutOfMemoryError选项时,当抛出OutOfMemoryError异常时,生成heap dump

    jcmd:JDK中最新的诊断设备

    jcmd用于将诊断命令请求发送到JVM,这些请求对于控制Java Flight Recordings,排除故障以及诊断JVM和Java应用程序非常有用。

    jstack:获取Java线程的stack trace

    主要用途: 定位线程出现长时间停顿的原因,如多线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。

    3.2 JMC与JFR

    JFR和JMC共同创建了一个完整的工具链,可以持续收集低级别和详细的运行时信息,从而实现事后事件分析。 该工具链使开发人员和管理员能够从本地运行或部署在生产环境中的Java应用程序中收集和分析数据。

    3.3 JConsole

    JConsole是一个GUI监视工具,使用JVM上的大量工具来提供有关Java平台上运行的应用程序的性能和资源消耗的信息。

    3.4 Visual VM

    VisualVM提供了一个可视化界面,用于查看有关Java应用程序在JVM上运行时的详细信息。 它使用了各种技术,包括jvmstat,JMX,Serviceability Agent(SA)和Attach API 功能:

    展示本地和远程的Java进程展示进程的配置与环境监控进程的性能与内存使用线程可视化性能分析与内存占用展示Thread Dumps浏览Heap Dumps分析Core Dumps

    3.5 Eclipse Memory Analyzer (MAT)

    内存堆导出文件的分析工具 在创建了以.hprof为后缀的新heap dump后,使用MAT进行分析。 Histogram: Shallow heap:某个对象消耗的实际内存 Retained set:如果某对象被GC,所释放的内存 Outgoing references:该对 象所引用的其他对象 Incoming references:引用该对象的其他对象 可以按包查看或按父类查看 支配树 Dominator tree:展示了内存导出文件中最大的对象 下一级列出了如果来自父节点的所有引用被移除之后,将会消失的对象。 支配树用来观察哪个对象使哪些其他对象“alive” MAT可以使用OQL查询

    最新回复(0)