【软件构造】课件精译(二十) 动态性能分析方法与工具

2024-03-01 20:32

本文主要是介绍【软件构造】课件精译(二十) 动态性能分析方法与工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、动态程序分析

动态程序分析:根据程序的一次或多次执行的过程与结果,分析代码在时空性能方面所展现出的性质
静态与动态分析
在这里插入图片描述
为使动态分析有效,目标程序必须执行足够多次,以观察到完整的、不同的执行行为。
通过分析代码覆盖度,确认动态分析是否已经足够。
要尽可能小的影响程序原本的执行,否则性能测量不准确 。
测量某事物的行为将会不可避免的干扰/扰乱它,从而改变它的状态。
Example 1:程序热点
每个程序实体(语句、分支、路径、方法等)的执行概率/频度是多少?
80-20原则:20%的程序负责80%的执行时间
目标:性能调优、性能分析驱动的编译、逆向工程
Example 2:路径分析
在这里插入图片描述

二、程序剖析:概念和方法

剖析器
利用剖析器检测源代码或执行程序以获取信息,用于代码过于庞大而难以阅读剖析的情况
这个工具可以用来评估代码在新架构上的表现,发现代码的关键区域以及指令调度或分支预测算法的执行情况
剖析器的输出
所观察到的程序执行事件的统计结果,同代码量相关
在这里插入图片描述
输出一个事件流,事件跟踪同指令路径长度相关
在这里插入图片描述
实时或周期性的获取/展示程序运行过程中的数据,提供了在执行期间在任何期望的点处开启或关闭trace的机会,提供了在关键点暂停异步进程以更详细地检查与其他并行进程的交互
在这里插入图片描述
平面剖析器根据调用计算平均调用时间,并且不根据被调用者或上下文分解调用时间。
调用图剖析器显示调用时间,功能的频率,以及基于被调用者所涉及的调用链。 在某些工具中,不保留完整的上下文。
输入敏感性剖析通过将性能度量与输入工作负载的功能相关联(例如输入大小或输入值),为平面或调用图剖析器添加更多维度。 它们生成的图表表征应用程序的性能如何根据其输入进行扩展。
剖析方法
剖析器可以使用许多不同的技术,例如基于事件的,统计的,仪表化的和模拟的方法。在收集数据方面,剖析器采用硬件中断、代码指令、指令集模拟、操作系统挂钩、性能计数器
剖析器通常采用以下三种方法:

(1)代码注入/代码插入

在原始程序中加入某些语句来收集运行时数据,这些语句不改变原程序的语义,但对原程序的性能有了轻微改变
在源代码中注入较为简单,在目标代码(.o与.class)中较为困难

Pros:可以被很多平台使用,在某些意义上比较准确,无法比较容易地做内存剖析
Cons:需要修改程序;注入代码可能影响测试结果

(2)采样

以特定的频率观察程序执行在特定时刻所展现出的行为与状态
采样:周期性监控被测程序,存储各时刻的快照
基于收集到的数据,分析程序当时所处的状态,分析性能

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

(3)借助于虚拟机获取程序性能数据

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

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

三、程序剖析工具

(1)命令行剖析工具

jstat:获取JVM的heap使用和GC的性能统计数据
在这里插入图片描述
在这里插入图片描述
jmap:输出内存中的对象分布情况
jmap -dump:format=b,file=filename causes jmap to dump the Java heap in binary format to a specified file. 导出heap dump

jmap -histo for obtaining a class specific histogram(柱状图) of the heap. 获取堆中类的特定柱状图
在这里插入图片描述
在这里插入图片描述
jhat:导出heap dump,浏览/查询其中的对象分布情况
jhat是heap dump文件的浏览和查询工具
在这里插入图片描述
OQL(Object Query Language)
在这里插入图片描述

jstack:获取Java线程的stack trace
在这里插入图片描述
jstack为给定的Java进程或核心文件或远程调试服务器打印Java线程的堆栈跟踪
主要用途:
定位线程出现长时间停顿的原因,如多线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
在这里插入图片描述
jps (JVM Process Status Tool) 虚拟机进程状况工具: 列出当前运行的JVM 进程

jMC:Java Mission Control是一个剖析、检测和诊断的工具集

(2)JConsole

JConsole图形用户界面是一个监视工具,提供有关Java平台上运行的应用程序的性能和资源消耗的信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)VisualVM

VisualVM是一个工具,它提供了一个可视化界面,用于在JVM上运行时查看有关Java应用程序的详细信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Visual GC
在这里插入图片描述

四、内存分析器(MAT)

Eclipse Memory Analyzer是一个快速且功能丰富的Java堆分析,可帮助您查找内存泄漏并减少内存消耗。——内存堆导出文件的分析工具
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
浅堆和保留的堆
浅堆:某个对象消耗的实际内存
保留的堆:如果某对象被GC,所释放的内存
对象的浅堆是其在堆中的大小,而保留的大小是在对象被垃圾回收时将释放的堆内存量。
Outgoing references:该对象所引用的其他对象
Incoming references:引用该对象的其他对象
Group by class loader, packages or superclass
支配树:支配树展示了内存导出文件中最大的对象
在这里插入图片描述
如果对象图从开始(或根)节点到y的每个路径都必须经过x,则对象x支配对象y
某个对象y的直接支配者x是最靠近对象y的支配者
在支配树中,每个对象都是子对象的直接支配者,所以对象之间的依赖关系很容易被识别出来。
支配树具有以下重要属性:
属于x的子树的对象(即由x支配的对象)表示保留的x组。
如果x是y的直接支配者,那么x的直接支配者也支配y,依此类推。
支配树中的边不直接对应于来自对象图的对象引用。
在这里插入图片描述
在这里插入图片描述
Querying Heap Objects (OQL)
SELECT * FROM [ INSTANCEOF ] < class name=“name” > [ WHERE < filter-expression > ] < /filter-expression >< /class >
MAT允许使用自定义类SQL查询来查询堆转储。 OQL将类表示为表,将对象表示为行,将字段表示为列。
内存泄露分析
对问题发生时刻的系统内存状态获取一个整体印象。
找到最有可能导致内存泄露的元凶,通常是消耗内存最多的对象
进一步查看内存消耗最大的类/对象的具体情况,看是否有异常行为。

这篇关于【软件构造】课件精译(二十) 动态性能分析方法与工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/763710

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进