分析应用程序#
CPU Profiler #
CPU Profiler是IntelliJ IDEA Ultimate中的实验性功能。
CPU Profiler可在Linux和macOS上使用。
CPU Profiler监视应用程序的JVM级参数,以便更好地了解应用程序的执行方式以及资源的分配方式。此数据可帮助您查找和解决性能问题。
CPU Profiler显示哪些功能占用了CPU时间的百分比。此信息可以帮助您更好地了解应用程序的执行方式以及资源的分配方式。
您可以为使用Gradle构建的项目和本机IntelliJ IDEA构建工具运行探查器。
分析完成后,分析器会显示报告中的输出数据,使其更易于理解。
在开始使用CPU Profiler之前,请在实验性功能列表中启用此选项。在Linux上,您还需要安装Perf工具并调整内核选项。
在Linux上安装Perf并调整内核选项#
如果您使用的是Linux,请确保完成以下步骤:
-
为特定的内核版本安装Perf工具。使用 找出确切的版本,然后安装相应的Linux工具包。例如:
uname -r
marinak@marinak-VirtualBox:~$ uname -r 4.15.0-36-generic marinak@marinak-VirtualBox:~$ sudo apt-get install linux-tools-4.15.0-36-generic
-
调整内核选项。在Linux上启动Profiler之前,需要设置两个内核选项:
-
perf_event_paranoid - 控制非root用户对性能事件数据的使用。将其值设置为小于2,以使分析器在没有root权限的情况下收集性能信息:
sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid'
-
kptr_restrict设置对公开内核地址的限制。要正确解析内核符号,请通过将其值设置为0来禁用kptr_restrict提供的保护:
sudo sh -c 'echo 0 >/proc/sys/kernel/kptr_restrict'
默认情况下,这些更改仅影响您当前的OS会话。要在系统重新启动后保持设置,请运行:
sudo sh -c 'echo kernel.perf_event_paranoid=1 >> /etc/sysctl.d/99-perf.conf' sudo sh -c 'echo kernel.kptr_restrict=0 >> /etc/sysctl.d/99-perf.conf' sudo sh -c 'sysctl --system'
首次启动分析器时,IntelliJ IDEA会检查内核变量是否已设置并建议必要的更改:
-
在Linux和macOS上启用实验性功能的CPU Profiler #
CPU Profiler仍然是一项实验性功能,默认情况下不启用。要使用分析器,您需要启用它。
-
按Ctrl+Shift+A以打开“ 查找操作”对话框,键入
Experimental features
,然后按Enter。 -
选中旁边的复选框
java.profiler.enabled
,应用更改,然后关闭对话框。
使用探查器#
运行探查器#
-
从主菜单中,选择“运行”| 使用Async Profiler运行“类名”,或单击
工具栏上的按钮。
应用程序停止并且分析数据准备就绪后,您将看到一个确认弹出窗口,并显示CPU Profiler工具按钮。单击此按钮可打开CPU Profiler工具窗口( 如果不使用工具按钮,则转到View | Tool Windows | CPU Profiler)。
要在停止应用程序之前停止探查器,请使用CPU Profiler工具窗口中的 按钮。
导出分析器结果#
-
从主菜单中,选择View | 工具窗口| CPU Profiler用于打开Profiler工具窗口。
-
在工具窗口的左侧框架中,单击“
导出Profiler结果”。
-
在打开的对话框中,为文件命名并指定要在其中保存文件的文件夹。单击保存。
解释结果#
在CPU Profiler工具窗口中,收集的数据显示在三个选项卡上 - 火焰图表, 调用树和方法列表。左侧部分列出了应用程序线程; 通过单击每个线程,您可以了解更多详细信息。
火焰图
此选项卡显示性能配置文件中任何时刻的调用堆栈的状态。每个块表示堆栈中的函数(堆栈帧)。在Y轴上,堆叠深度从下向上。X轴显示从最耗费CPU的功能到最少耗费功能的堆栈配置文件。
阅读火焰图时,请注意最宽的块。这些块是最多在配置文件中显示的功能。您可以从底部开始向上移动,遵循从父方法到子方法的代码流,或者使用相反的方向来探索显示直接在CPU上运行的函数的顶部块。
在Flame Chart选项卡中,您可以将鼠标悬停在任何块上以查看详细信息:
呼叫树
“ 调用树”选项卡显示程序调用树,其中包含总分析时间中每个函数的百分比。它组织数据以显示应用程序总共花费大部分时间的位置。要配置和过滤“ 调用树”视图,请使用 和
按钮。
方法列表
“ 方法列表”选项卡显示按样本数排序的方法列表。对于列表中的每个方法,探查器提供有关嵌套选项卡的更多信息。“ 返回跟踪”选项卡显示已调用所选方法的位置。“ 合并的被调用者”选项卡显示从所选方法开始的调用跟踪。
依赖性分析#
IntelliJ IDEA建议以下方法分析项目中的依赖项:
-
分析用法,帮助您找到对某个类,变量,方法或参数的所有引用。此工具包括 整个项目的搜索和 查看用法,并突出显示文件中的用法。
-
查看文件结构的可能性 。
-
搜索重复的代码片段。
-
使用依赖关系结构矩阵分析探索复杂的依赖关系。
DSM分析#
此功能仅在Ultimate版本中受支持。
必须启用捆绑的DSM Analysis插件。
处理具有大量依赖关系的复杂项目使得很难理解在哪里查找问题。您可能会遇到可能严重影响应用程序性能和行为的复杂关系或循环依赖关系。这是DSM帮助的地方。
DSM代表依赖结构矩阵 - 一种帮助您可视化项目各部分(模块,类等)之间的依赖关系的方法,并突出显示项目中的信息流。
DSM分析可用于查看更改将如何影响项目。例如,如果需要更改其中一个类,则可以标识所有依赖项,并查看此更改将如何在项目中传播。
分析依赖矩阵#
-
从主菜单中,选择Analyze | 分析依赖矩阵。
-
在打开的对话框中,选择要分析的范围,然后单击“ 确定”。
如果项目类文件已过期,则分析可能会导致数据不完整或不正确。为避免这种情况,IntelliJ IDEA会在继续进行DSM分析之前提示您编译项目。
DSM工具窗口将打开,使您可以检查依赖项。通过单击工具窗口中的单元格,您可以更详细地了解。
DSM工具窗口以特殊方式对依赖项进行排序:最常用的类被移动到底部。
在矩阵上,所有依赖项始终从绿色流向黄色:当您选择行时,绿色注释显示相关组件,而黄色注释显示所选组件所依赖的组件。相互依赖关系以红色显示。各种阴影对应于依赖性的数量。相关单元越多,依赖性就越大。
探索依赖关系#
您可以限制视图以仅查看选定的依赖项。与Limit Scope选项相反,仅保留产生所选依赖关系的类。
-
在DSM工具窗口中,右键单击必要的依赖关系,然后选择Explore Dependencies Between。
生成这些依赖项的类将在DSM工具窗口的新选项卡中打开。
查找依赖项的用法#
您可以打开选定的依赖项以进行进一步的源代码分析。
-
在DSM工具窗口中,右键单击必要的依赖关系,然后选择Find Usages for Dependencies。
限制DSM范围#
您可以将DSM的范围限制为所选行。只有这些将保留在新矩阵中。
-
选择要保留的行,然后从上下文菜单中选择“ 限制范围到选择”。
有限的范围将在DSM工具窗口的新选项卡上打开。
查看源代码的结构和层次结构#
IntelliJ IDEA使您可以在“层次结构”工具窗口中检查类,方法和调用的层次结构,并在“结构”工具窗口中浏览源文件的结构。
-
“ 视图”菜单中提供了“ 层次结构”和“ 结构”工具窗口。
-
只有在构建层次结构时,“ 层次结构”工具窗口才可用。
-
层次结构在“ 导航”菜单中构建。
在这部分:
构建调用层次结构#
IntelliJ IDEA使您可以在“层次结构”工具窗口中检查类,方法和调用的层次结构,并在“结构”工具窗口中浏览源文件的结构。层次结构工具窗口。在查看调用层次结构之前,您需要至少构建一个。
构建方法调用的层次结构#
-
在编辑器中,将插入符号放在方法声明或用法中。在项目视图或其他工具窗口中,选择所需的方法。
-
执行以下操作之一:
-
按Ctrl+Alt+H。
-
构建类层次结构#
IntelliJ IDEA使您可以在“层次结构”工具窗口中检查类,方法和调用的层次结构,并在“结构”工具窗口中浏览源文件的结构。层次结构工具窗口。在查看调用层次结构之前,您需要至少构建一个。
请注意,在构建类层次结构时,“层次结构”工具窗口仅可用,如下所述。
构建类的层次结构#
-
在“项目”工具窗口中选择所需的类,或在编辑器中将其打开。
-
在主菜单上,选择“ 导航”| 键入层次结构或按Ctrl+H。
构建方法层次结构#
方法层次结构可以检查给定方法所在的类的树视图:
-
defined(
)。
-
未定义,但在超类(
)中定义。
-
要定义,因为类不是abstract(
)。
构建方法层次结构#
-
在“项目”工具窗口中选择所需的方法,或将插入符号放在编辑器中的方法声明中。
- 执行以下操作之一:
-
在主菜单上,选择“ 导航”| 方法层次结构。
-
按Ctrl+Shift+H。
-
保留层次结构选项卡#
默认情况下,每次构建新层次结构时,IntelliJ IDEA都会覆盖“ 层次结构”工具窗口中的当前选项卡。您可以保留所需选项卡的内容,并在新选项卡中构建下一个层次结构。
保留层次结构选项卡#
-
在“ 层次结构”工具窗口中,单击工具栏上的“ 引脚”选项卡按钮
。
查看层次结构#
显示层次结构工具窗口#
没有要显示的层次结构时,不显示“层次结构”工具窗口。您必须首先构建层次结构。
请参阅构建类层次结构,构建调用层次结构和构建方法层次结构 以了解如何构建层次结构。
要打开“层次结构”工具窗口,请执行以下操作之一
-
在主菜单上,选择“ 查看”| 工具窗口| 层次结构。
-
使用Alt+8键盘快捷方式
在层次结构工具窗口的选项卡之间导航#
执行以下操作之一:
-
右键单击当前显示的选项卡,然后在上下文菜单中选择“ 选择下一个选项卡 / 选择上一个选项卡 ”。
-
使用Alt+Right和Alt+Left键盘快捷键。
-
单击当前显示的选项卡,然后选择要显示的下一个选项卡。
在视图之间切换#
在视图之间切换意味着显示升序或降序层次结构(被调用者与调用者方法,父类与子类等)。要在视图之间切换,请使用“层次结构”工具窗口的工具栏:
-
单击
以显示调用方法或超类型。
-
单击
以显示被调用方法或子类型。
查看源文件的结构#
您可以使用“ 结构”工具窗口(Alt+7)或“ 结构”弹出窗口()检查当前在编辑器中打开的文件的结构Ctrl+F12。
默认情况下,IntelliJ IDEA显示当前文件的所有类,方法和其他元素。要切换要显示的元素,请单击“ 结构”工具窗口工具栏上的相应按钮。例如:
-
单击
以显示类字段。
-
单击
以显示继承的成员。
-
单击
以显示包含的文件。
在“项目”工具窗口中显示班级成员#
-
右键单击“ 项目”工具窗口标题栏,然后从上下文菜单中选择“ 显示成员 ”。
分析后向依赖性#
通过这种类型的分析,您可以找到特定兴趣范围内的另一个类或模块,这取决于指定的分析范围(整个项目,模块,文件,无版本文件等)。分析结果显示在Dependency Viewer的专用选项卡中 。
向后依赖性分析可能相当耗时,尤其是在大型项目上。
分析项目的后向依赖性#
-
在主菜单上,选择 Analyze | 分析后向依赖关系。将打开“ 指定向后依赖关系分析范围”对话框。
-
在“ 分析范围”部分中,指定要为其查找依赖项的项目部分。
-
在“感兴趣的范围”部分中,指定寻求依赖关系的范围。您可以从下拉列表中选择一个预定义的范围,或单击省略号按钮并在“ 范围”对话框中创建自己的范围。
-
如果要分析测试源,请 选中“ 包含测试源”复选框。
-
单击“ 确定”以运行分析。分析正在进行时显示生产力提示。准备就绪后,Dependency Viewer会打开一个特殊选项卡,使您可以检查依赖关系。
-
在“依赖关系查看器”的左窗格中,选择要搜索的节点。在右侧窗格中,选择范围以查找所选节点的用法。搜索结果显示在选项卡的下部窗格中。
分析循环依赖关系#
通过循环依赖关系分析,您可以检测指定范围内的包之间的任何循环关系。分析结果显示在 依赖关系查看器的专用选项卡中。
分析项目的循环依赖关系#
-
在主菜单上,选择Analyze | 分析循环依赖。
-
在“ 指定循环依赖关系分析范围”对话框中,选择所需的分析范围。
-
单击“ 确定”以运行分析。分析正在进行时显示生产力提示。准备就绪后,Dependency Viewer会打开一个特殊选项卡,使您可以检查依赖关系。
-
在“依赖关系查看器”的左窗格中,选择要搜索的节点。在右侧窗格中,选择范围以查找所选节点的用法。搜索结果显示在选项卡的下部窗格中。
分析依赖关系#
IntelliJ IDEA使您能够分析项目的源代码并检测应用程序参与的依赖项。每个依赖关系分析的结果显示在Dependencies Viewer的单独选项卡中。
分析项目中的依赖项#
-
在主菜单上,选择Analyze | 分析依赖关系。或者,右键单击要分析的元素 - 包,类等 - 并在“ 项目工具”窗口的上下文菜单中或在编辑器中选择相同的命令。
-
在“ 指定依赖关系分析范围”对话框中,选择所需的分析范围。
-
分析重复#
此功能仅在Ultimate版本中受支持。
IntelliJ IDEA可帮助您在特定范围内查找重复的代码块。此范围可以是单个文件,项目,模块或自定义范围。分析结果显示在“ 重复项”工具窗口的专用选项卡中。
搜索重复项#
-
从主菜单中,选择Analyze | 找到重复项。
-
在“ 指定代码复制分析范围”对话框中,指定分析范围:整个项目,当前文件,未提交的文件(对于版本控制下的项目)或某些自定义范围。此外,您还可以将测试源包含在分析中。
-
在“ 代码复制分析设置”对话框中,选择要分析的语言。
对于每种语言,请检查选项以定义分析的首选项。例如,您可以选择请求相同匹配的代码片段被视为重复,或指定某个限制,低于该限制,代码构造不会被视为重复(以避免报告
if
源代码中的每个构造)。 -
在“ 重复项”工具窗口中,浏览搜索结果。
-
在工具窗口的左窗格中查看重复项列表。
-
查看右窗格中找到的重复项之间的差异。使用箭头按钮将选定的副本放在差异查看器的其中一个部分中,并比较代码的片段。
-
使用重复上下文菜单的“ 跳转到源”或“ 显示源”命令导航到编辑器中的重复项。
-
通过
在“ 提取方法”对话框中单击并指定方法名称和参数,消除源代码中的重复项 。此过程类似于Extract方法重构,唯一的区别是在重复分析的情况下,会自动找到重复的代码块。
-
快速检测重复#
IntelliJ IDEA可以实时识别重复项。这是通过检查 General |来完成的 重复的代码片段。
如果您偶然发现现有副本,或者通过编写或粘贴代码以某种方式创建副本,您将立即知道它。检查伴随着快速修复,使您可以导航到检测到的重复项,或在“ 查找”工具窗口中查看所有这些副本:
分析模块依赖关系#
模块依赖关系分析显示指定范围内存在的所有模块,这些模块之间的关系,它们在“项目结构”对话框的“ 依赖关系”选项卡中指定,以及模块之间的循环依赖关系。
分析模块依赖关系#
-
在主菜单上,选择Analyze | 分析模块依赖关系。
-
指定分析范围。您可以选择选择整个项目或特定模块。
-
检查模块依赖关系工具窗口中的依赖关系
-
在树视图中选择一个模块,然后使用
Module Dependencies工具窗口的工具栏按钮查找依赖于所选模块的模块。
分析外部堆栈跟踪#
在本页面:
概述#
您可能希望分析其他人(例如,QA工程师)收到的异常,或调查死锁或挂起问题。与您在调试模式或运行单元测试时获得的异常不同,这些异常没有帮助您导航到源代码中相应位置的链接。而且,源代码可以被加扰。
使用IntelliJ IDEA,您可以复制异常或完整的线程转储,将其粘贴到堆栈跟踪分析器,浏览信息并导航到相应的源代码。
分析外部堆栈跟踪#
分析外部堆栈跟踪或线程转储#
-
在主菜单上,选择 Analyze | 分析堆栈跟踪 ..
-
在打开的Analyze Stack Trace对话框中,将外部堆栈跟踪或线程转储粘贴到Put a stack trace或完整的线程转储: text area。
-
指定是否要将堆栈跟踪解压缩。为此 ,请选择“解密堆栈跟踪”复选框,选择所需的解码器和日志文件。
-
如果在使用某些软件(例如,错误跟踪器或邮件客户端)处理后,堆栈跟踪文本已损坏(行被剪切或包裹,或者太长等),请单击“ 标准化”。
-
单击确定。堆栈跟踪显示在“ 运行”工具窗口中。
-
在“ 运行”工具窗口中,滚动到所需的堆栈跟踪行,然后单击指向源文件的链接。源文件在编辑器中打开。
分析数据流#
在本页面:
简介#
您可能希望分析其他人(例如,QA工程师)收到的异常,或调查死锁或挂起问题。与您在调试模式或运行单元测试时获得的异常不同,这些异常没有帮助您导航到源代码中相应位置的链接。而且,源代码可以被加扰。数据流分析功能可以帮助您进行代码考古 - 更好地理解继承的项目代码,解释代码的复杂部分,找到源代码中的瓶颈等等。
使用IntelliJ IDEA,您可以复制异常或完整的线程转储,将其粘贴到堆栈跟踪分析器,浏览信息并导航到相应的源代码。来自此处的数据流功能允许您:
-
查看分配给变量的值的来源。
-
找出变量可能具有的所有可能值。
-
找出表达式\ variable \ method参数可以流入的位置。
-
揭示可能
NullPointerException
出现潜力的地方。
如果要追溯传递给插入符号参数的值,可以使用Analyze |创建源代码的 切片视图。 Dataflow to Here命令。而且,使用 Analyze | Dataflow from Here命令可以找到表达式可以流入的位置。每个数据流分析的结果显示在Analyze Dataflow工具窗口的专用选项卡中 。
分析数据流#
要分析符号的数据流:
-
打开所需的文件进行编辑,请参阅 查找插入符号,编辑的行或编辑的位置。
-
将插入符号放在要分析的符号上(expression \ variable \ method参数)。
-
在主菜单上,或从上下文菜单中,选择Analyze | 数据流到这里 或 分析| 来自此处的数据流 取决于您的目的。
-
指定分析范围,并选择是否要忽略来自测试代码的所有值。
-
单击确定。在专用的Analyze Dataflow工具窗口中查看分析结果。
检查数据流分析的结果#
以下部分简要介绍了如何“读取”数据流分析结果。
数据流到这里#
-
展开树以挖掘指向链的赋值和方法调用。具有灰色背景的节点表示重复(在另一个位置的树中已经存在的用法)。下图显示了Dataflow to Here分析结果的示例:
在以下的方向上的该视图流中的值:该字段的值String authType
在SingleSignonMessage
来自this.authType = authType
赋值语句中SingleSignOnMessage.setAuthType()
的方法调用从ClusterSingleSignOn.register()
方法用authType
参数等。 -
要找出符号可能具有的值,请单击 “ 数据流” 工具窗口主工具栏上的“ 按叶表达式分组”按钮 。
-
要查看分配和方法调用的代码,请按
切换按钮。IntelliJ IDEA添加了一个预览窗格,其中显示了当前在树中选择的分配或调用的代码,代码突出显示:
-
要导航到分配或调用的源代码,请双击树中的相关行。
来自这里的数据流#
分层视图类似于Dataflow to Here分析的结果,但值以相反的方向流动。
验证依赖关系#
在本页面:
验证依赖关系#
-
1. 在依赖关系查看器的工具栏中,单击“编辑规则”
按钮。 将打开“ 依赖关系验证”对话框 。
-
2. 定义禁止和允许使用的范围:
-
3. 应用更改。依赖性分析重新运行新规则。