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

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

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

jvm调优常用命令行工具详解

《jvm调优常用命令行工具详解》:本文主要介绍jvm调优常用命令行工具的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一 jinfo命令查看参数1.1 查看jvm参数二 jstack命令2.1 查看现场堆栈信息三 jstat 实时查看堆内存,gc情况3.1