blob: f2432024e40eae94ae7d8f6126ccf05c8b0d9bd1 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<title>在 NetBeans IDE 中对 Java 应用程序进行性能分析的简介</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<meta name="description" content="An introduction to profiling an application using NetBeans IDE">
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
</head>
<body>
<a name="top"></a>
<h1>在 NetBeans IDE 中对 Java 应用程序进行性能分析的简介</h1>
<p>NetBeans IDE 中包含一款功能强大的性能分析工具,可提供与应用程序的运行时行为有关的重要信息。通过 NetBeans 性能分析工具,可以从 IDE 中轻松监视线程状态、CPU 性能以及应用程序的内存使用情况,而且其开销相对较低。</p>
<p>本介绍性文档概述了包含在 IDE 中的性能分析工具,并将指导和帮助您快速启动对 NetBeans 项目的性能分析。本文档旨在介绍 IDE 中提供的各种性能分析任务,以及在进行项目性能分析时可以获取的性能分析结果。其中既没有涵盖 IDE 中的所有性能分析功能,也未介绍如何解释性能分析结果以解决应用程序中可能存在的特定性能问题。</p>
<p>在本文档中,将使用性能分析工具获取与 Anagram Game 样例应用程序(包含在 IDE 中的简单 Java 应用程序)有关的性能分析数据。虽然 Anagram Game 是一个非常简单的 Java 应用程序项目,但仍可按照同样的步骤,对更大型、更复杂的 Java 应用程序以及 Web 和企业应用程序项目进行性能分析。</p>
<p>本文档介绍了如何使用 IDE 对应用程序进行性能分析并获取以下性能分析结果:</p>
<ul>
<li>应用程序的运行时行为</li>
<li>应用程序的方法使用的 CPU 时间</li>
<li>创建对象</li>
</ul>
<p>此外,本文档还介绍了如何生成并比较性能分析结果的快照。</p>
<img alt="此页上的内容适用于 NetBeans IDE 6.9、7.0、7.1 和 7.2" class="stamp" src="../../../images_www/articles/70/netbeans-stamp-70-71-72.gif" title="此页上的内容适用于 NetBeans IDE 6.9、7.0、7.1 和 7.2" />
<p><b>目录</b></p>
<ul class="toc">
<li><a href="#firsttime">首次执行性能分析</a>
<ul class="toc">
<li><a href="#create">创建样例项目</a></li>
<li><a href="#calibrate">首次使用分析器</a></li>
</ul>
</li>
<li><a href="#select">选择性能分析任务</a>
<ul class="toc">
<li><a href="#monitor">监视应用程序</a></li>
<li><a href="#cpu">分析应用程序性能</a>
<li><a href="#memory">分析内存使用情况</a></li>
</ul>
</li>
<li><a href="#snapshot">生成快照</a>
<ul class="toc">
<li><a href="#takesnap">生成和比较内存快照</a></li>
</ul>
</li>
</ul>
<h2>入门指南</h2>
<div class="indent">
<h3>先决条件</h3>
<p>本文档假定您具备以下技术的一些基本知识或编程经验:</p>
<ul>
<li>Java 编程</li>
<li>NetBeans IDE</li>
</ul>
<h3>本教程所需要的软件</h3>
<p>在学习本教程之前,您需要在计算机上安装以下软件:</p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">软件或资源</th>
<th class="tblheader" scope="col">要求的版本</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">6.9、7.0、7.1、7.2</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 开发工具包 (JDK)</a></td>
<td class="tbltd1">版本 6 或 7</td>
</tr>
</tbody>
</table>
<p class="notes"><strong>注:</strong></p>
<ul>
<li>性能分析工具与 NetBeans IDE 捆绑在一起,无需进行特定的设置,即可开始对应用程序进行性能分析。</li>
</ul>
</div>
<a name="firsttime"></a>
<h2>首次执行性能分析</h2>
<p>首次使用性能分析工具时,IDE 需要执行一些初始操作以确保获取准确的性能分析结果,并将该工具与项目进行集成。为演示此情况,首先将创建 AnagramGame 项目,然后再执行校准。首次对 AnagramGame 项目进行性能分析时,IDE 将自动执行集成操作。</p>
<div class="indent">
<a name="create"></a>
<h3>创建样例项目</h3>
<p>在本文档中,将对 Anagram Game 样例应用程序进行性能分析。为此,首先要使用新建项目向导来创建样例应用程序并将项目设置为主项目。</p>
<p>要创建 Anagram Game 应用程序,请执行以下步骤。</p>
<ol>
<li>从主菜单中,选择 "File"(文件)> "New Project"(新建项目)(Ctrl-Shift-N 组合键;在 Mac 上为 ⌘-Shift-N 组合键)。</li>
<li>在新建项目向导中,选择 "Samples"(样例)> "Java" 类别。</li>
<li>选择 Anagram Game 项目。单击 "Next"(下一步)。</li>
<li>指定项目的位置。单击 "Finish"(完成)。
<p>单击 "Finish"(完成),此时 IDE 将创建 Anagram Game 样例项目。</p>
</li>
<li>从主菜单中选择 "Run"(运行)> "Set Main Project"(设置为主项目)> "AnagramGame"。</li>
</ol>
<p>在将项目设置为主项目后,您可以看到 Anagram Game 项目的名称在 "Projects"(项目)窗口中显示为粗体。默认情况下,使用 IDE 对项目进行性能分析时,IDE 也将对主项目进行性能分析。如果未将项目设置为主项目,则 IDE 将会对在 "Projects"(项目)窗口中选择的项目进行分析。</p>
<a name="calibrate"></a>
<h3>首次使用分析器</h3>
<p>要获得准确的性能分析结果,必须拥有每个要用于性能分析的 Java 平台的校准数据。如果是首次运行性能分析工具,或没有可用于 Java 平台的有效校准数据,则 IDE 将提示您为平台运行校准过程。</p>
<p>校准只需执行一次即可。不过,如果对计算机配置进行任何可能会影响其性能的重大更改,则应重新运行校准过程。您可以通过执行以下步骤随时运行校准过程。</p>
<ol>
<li>从 "Profile"(性能分析)菜单中,选择 "Advanced Commands"(高级命令)> "Run Profiler Calibration"(运行分析器校准)。</li>
<li>选择 Java 平台。单击 "OK"(确定)。</li>
</ol>
<img alt=""Select Java Platform"(选择 Java 平台)对话框" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/calibrate-select-platform.png" title="用于在校准时选择 Java 平台的对话框。" />
<p>完成校准操作之后,将会显示一个对话框。您可以单击 "Show Details"(显示详细信息),以查看一个对话框,其中包含与校准结果有关的信息。每个 Java 平台的校准数据都保存在主目录的 <tt>.nbprofile</tt> 目录中。</p>
<img alt=""Calibration Information"(校准信息)对话框的屏幕快照" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/calibrate-information.png" title=""Calibration Information"(校准信息)对话框" />
<p class="notes"><strong>注:</strong>如果您使用的是 NetBeans IDE 6.9 或更低版本,则首次对项目进行分析时,将会显示一个对话框,指出 IDE 需要将性能分析工具与目标项目进行集成。</p>
<div class="indent">
<img alt=""Enable Profiling"(启用性能分析)对话框" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/profile-intro-integrate.png" title="用于将分析器与项目进行集成的对话框。" />
<p>要与项目进行集成,IDE 将修改项目的构建脚本 (<tt>build.xml</tt>) 来添加以下行,以导入所需性能分析库的其他构建脚本。</p>
<pre class="examplecode">&lt;import file=&quot;nbproject/profiler-build-impl.xml&quot;/&gt;</pre>
<p>
修改构建脚本之前,IDE 将会创建原始构建脚本 (<tt>build-before-profiler.xml</tt>) 的备份。您可以通过从 "Profile"(性能分析)菜单中选择 "Advanced Commands"(高级命令)> "Unintegrate"(取消集成)随时恢复原始构建脚本。</p>
</div>
</div>
<a name="select"></a>
<h2>选择性能分析任务</h2>
<p>IDE 提供了各种内部设置,用于优化性能分析,以满足您的需要。例如,可以降低性能分析开销,但代价是生成的信息量会有所减少。不过,要了解各种可用设置的含义和用法,可能需要花些时间。对很多应用程序而言,为性能分析任务指定的默认设置足以应对大多数情况。</p>
<p>对项目进行性能分析时,可以使用 "Select Profiling Task"(选择性能分析任务)对话框,根据要获取的性能分析信息类型选择所需的任务。下表描述了性能分析任务以及通过运行任务获取的性能分析结果。</p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">性能分析任务</th>
<th class="tblheader" scope="col">结果</th>
</tr>
<tr>
<td class="tbltd1"><a href="#monitor">监视应用程序</a></td>
<td class="tbltd1">选择此任务可获取有关目标 JVM 属性的高级信息,其中包括线程活动和内存分配。</td>
</tr>
<tr>
<td class="tbltd1"><a href="#cpu">分析 CPU 性能</a></td>
<td class="tbltd1">选择此任务可获取有关应用程序性能的详细数据,其中包括方法的执行时间和调用次数。</td>
</tr>
<tr>
<td class="tbltd1"><a href="#memory">分析内存使用情况</a></td>
<td class="tbltd1">选择此任务可获取有关对象分配和垃圾回收的详细数据。</td>
</tr>
</table>
<p>"Select Profiling Task"(选择性能分析任务)对话框是用于运行性能分析任务的主界面。选择任务后,可以修改任务设置,以优化要获取的结果。对于每个性能分析任务,还可以根据任务创建并保存定制性能分析任务。创建定制性能分析任务时,将在 "Select Profiling Task"(选择性能分析任务)对话框中列出定制任务,以便于您稍后可以轻松找到并运行定制设置。创建定制性能分析任务时,可以修改更高级的性能分析设置,方法是单击 "Select Profiling Task"(选择性能分析任务)对话框中的 <b>Advanced settings</b>(高级设置)。</p>
<div class="indent">
<a name="monitor"></a>
<h3>监视应用程序</h3>
<p>选择 "Monitor"(监视)任务时,将启动目标应用程序,而不进行任何分析。监视应用程序时,可以获取有关目标 JVM 的几个重要属性的高级信息。监视应用程序产生的开销非常低,因此,应用程序可以在长时间内以这种模式运行。</p>
<p>要监视 Anagram Game 应用程序,请执行以下步骤。</p>
<ol>
<li>确认将 AnagramGame 项目设置为主项目。</li>
<li>从主菜单中选择 "Profile"(性能分析)> "Profile Main Project"(分析主项目)。
<p>此外,也可以在 "Projects"(项目)窗口中右键单击项目节点,然后选择 "Profile"(性能分析)。</p></li>
<li>在 "Select Profiling Task"(选择性能分析任务)对话框中选择 "Monitor"(监视)。</li>
<li>根据需要,选择其他监视选项。单击 "Run"(运行)。<br> <img alt=""Select Profiling Task"(选择性能分析任务)对话框 - "Monitor Application"(监视应用程序)" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/monitor-task.png" title="选择 "Monitor Application"(监视应用程序)性能分析任务">
<p class="tips">将光标悬停在某一选项上即可查看包含有关该选项详细信息的工具提示。</p>
</li>
</ol>
<p>单击 "Run"(运行)后,IDE 将启动应用程序,此时 "Profiler"(分析器)窗口将在 IDE 的左窗格中打开。"Profiler"(分析器)窗口中包含用于执行以下操作的控件:</p>
<ul>
<li>控制性能分析任务</li>
<li>查看当前性能分析任务的状态</li>
<li>显示性能分析结果</li>
<li>管理性能分析结果快照</li>
<li>查看基本遥测统计信息</li>
</ul>
<p>使用 "Profiler"(分析器)窗口或主菜单中的控件,可以打开相关窗口在其中查看监视数据。使用 "Telemetry Overview"(遥测概览)窗口,可以快速实时地概览监视数据。如果将光标放在图形上,则可以查看与该图形中显示的数据相关的更详细统计信息。在 "Telemetry Overview"(遥测概览)窗口中,可以双击任何图形,以打开该图形更大、更详细的版本。</p>
<img alt=""Telemetry Overview"(遥测概览)窗口的屏幕快照" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/profile-intro-telemoverview.png" title=""Telemetry Overview"(遥测概览)窗口">
<p class="tips">如果该概览未自动打开,则可选择 "Window"(窗口)> "Profiling"(性能分析)> "VM Telemetry Overview"(VM 遥测概览),以便在 "Output"(输出)窗口中打开该概览。您可以打开 "VM Telemetry Overview"(VM 遥测概览)窗口,并在任意性能分析会话期间随时查看监视数据。<p>
<a name="cpu"></a>
<h3>分析 CPU 性能</h3>
<p>选择 "CPU" 任务时,IDE 会对应用程序的方法级 CPU 性能(执行时间)进行分析并实时处理结果。您可以选择通过以下方法来分析性能:定期进行堆栈跟踪,或分析应用程序中的方法。您也可以选择分析所有方法,或只分析部分应用程序代码,甚至可以只分析特定代码片段。</p>
<p>要分析 CPU 性能,可通过选择以下一个选项,选择应用程序的性能分析方式。</p>
<ul>
<li><b>Quick (Sampled)</b>(快速(采样))。在此模式中,IDE 对应用程序进行采样并定期执行堆栈跟踪。此选项不如分析方法精确,但是开销较低。借助此选项,可以找到可能需要分析的方法。</li>
<li><b>Advanced (Instrumented)</b>(高级(分析))。在此模式中,将对所分析的应用程序的方法进行分析。IDE 会记录线程进入和退出项目方法的时间,方便您查看在每个方法中花费的时间。在进入某个方法时,线程将生成“方法进入”事件。在退出该方法时,线程将生成相应的“方法退出”事件。系统将记录这两个事件的时间戳。该数据是实时处理的。
<p>您可以选择分析应用程序中的所有方法,也可以通过指定一个或多个<b>根方法</b>只分析部分应用程序代码。要指定根方法,可以在源代码中使用弹出式菜单,也可以单击 <b>customize</b>(定制),打开 "Edit Profiling Roots"(编辑性能分析根目录)对话框。</p>
<p>根方法是源代码中可指定为分析根的方法、类或包。当应用程序的某个线程进入和离开分析根时,系统将会收集性能分析数据。在应用程序的某个线程进入根方法之前,系统不会收集任何性能分析数据。指定根方法可以大大减少性能分析开销。对于某些应用程序,指定根方法可能是获取所有详细和/或实际性能数据的唯一方式,因为对整个应用程序进行性能分析时,可能会生成大量的性能分析数据,使应用程序无法使用,甚至可能导致其崩溃。</p>
</li>
</ul>
<p class="notes"><b>注:</b>快速分析模式不适用于 NetBeans IDE 7.0 及更低版本。您只能通过分析获取性能分析结果,但是,您可以选择分析整个应用程序,也可以通过指定一个或多个根方法,只分析部分应用程序。
</p>
<p class="tips">您可以进一步优化所分析的代码量,方法是使用过滤器限制所分析的源。</p>
<p>现在,您将使用 IDE 分析 Anagram Game 应用程序的 CPU 性能。此外,您还将选择 "Part of Application"(部分应用程序)选项,然后选择 <tt>WordLibrary.java</tt> 作为性能分析根。通过选择此类作为性能分析根,可以只对此类中的方法进行分析。</p>
<ol>
<li>在 "Profiler"(分析器)窗口中单击 "Stop"(停止)按钮,以停止前一个性能分析会话(如果仍在运行)。</li>
<li>从主菜单中选择 "Profile"(性能分析)> "Profile Main Project"(分析主项目)。</li>
<li>在 "Select Profiling Task"(选择性能分析任务)对话框中选择 "CPU"。</li>
<li>选择 <strong>Advanced (Instrumented)</strong>(高级(分析))。
<p>要使用此选项,还需要指定性能分析根方法。</p></li>
<li>单击 <b>Customize</b>(定制),打开 "Edit Profiling Roots"(编辑性能分析根目录)对话框。<br /> <img alt=""Select Profiling Task"(选择性能分析任务)对话框 - CPU" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/select-cpu-task.png" title="选择 CPU 性能分析任务" /></li>
<li>在 "Edit Profiling Roots"(编辑性能分析根目录)对话框中,展开 "AnagramGame" 节点,然后选择 <tt>Sources/com.toy.anagrams.lib/WordLibrary</tt>。对项目进行性能分析时,可以指定多个根方法。<br /> <img alt="用于选择根方法的对话框" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/edit-profiling-roots.png" title="用于选择根方法的对话框" /></li>
<li>单击 "Advanced"(高级)按钮,以打开 "Edit Profiling Roots (Advanced)"(编辑性能分析根目录(高级))对话框,该对话框提供了更高级的选项,用于添加、编辑和删除根方法。<br /> <img alt="用于指定根方法的对话框" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/edit-profiling-roots-adv.png" title="用于指定根方法的对话框" />
<p>您可以看到 <tt>WordLibrary</tt> 被列为根方法。单击 "OK"(确定)以关闭 "Edit Profiling Roots (Advanced)"(编辑性能分析根目录(高级))对话框。</p>
</li>
<li>单击 "OK"(确定),以关闭 "Edit Profiling Roots"(编辑性能分析根目录)对话框。
<p>在选择性能分析根目录后,在 "Select Profiling Task"(选择性能分析任务)对话框中单击 <b>edit</b>(编辑)即可修改所选的根方法。</p></li>
<li>选择 <b>Profile only project classes</b>(只分析项目类)作为过滤器值。
<p>
使用此过滤器可以限制所分析的类。您可以从 IDE 的预定义性能分析过滤器中选择,也可以创建自己的定制过滤器。单击 <b>Show filter value</b>(显示过滤器值)即可查看在应用所选过滤器时进行分析的类列表。
</p>
<img alt=""Show Filter Value"(显示过滤器值)对话框" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/show-filter-value.png" title=""Show Filter Value"(显示过滤器值)对话框" />
</li>
<li>在 "Select Profiling Task"(选择性能分析任务)对话框中单击 "Run"(运行)以启动性能分析会话。</li>
</ol>
<p>单击 "Run"(运行)后,IDE 将启动应用程序,并开始性能分析会话。要查看性能分析结果,请在 "Profiler"(分析器)窗口中单击 "Live Results"(实时结果)以打开 "Live Results"(实时结果)窗口。"Live Results"(实时结果)窗口将显示迄今为止收集的性能分析数据。默认情况下,每几秒钟就刷新一次显示的数据。分析 CPU 性能时,"Live Results"(实时结果)窗口会显示与每个方法所花费时间相关的信息,以及与每个方法的调用次数相关的信息。您可以看到,在 Anagram Game 应用程序中,最初只调用选定的根方法。</p>
<img alt=""CPU Live Results"(CPU 实时结果)的屏幕快照" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/cpu-liveresults1.png" title="CPU Live Results(CPU 实时结果)" />
<p>您可以快速导航至包含任何列出方法的源代码,方法是:右键单击方法的名称,然后选择 "Go To Source"(转至源)。单击 "Go To Source"(转至源)后,将在源代码编辑器中打开类。</p>
<a name="memory"></a>
<h3>分析内存使用情况</h3>
<p>"Analyze Memory Usage"(分析内存使用情况)任务提供了与目标应用程序中已分配对象有关的数据,如已分配对象的数量、类型和位置。 </p>
<p>要分析内存性能,可以选择下列一个选项,以选择要获取的数据量:</p>
<ul>
<li><b>Record object creation only</b>(仅记录对象创建)。如果选中此选项,则将对当前由目标 JVM 加载的所有类(以及加载时生成的每个新类)进行分析以生成有关对象分配的信息。</li>
<li><b>Record both object creation and garbage collection</b>(同时记录对象创建和垃圾回收)。如果选中此选项,则对应用程序进行性能分析时将提供有关对象活动的信息,例如每种类型中有多少对象仍处于活动状态,这些对象的大小和平均生存期以及分配数据。</li>
</ul>
<p>从功能方面来讲,第一个选项是第二个选项的子集,使用它所产生的性能和内存开销较少。在 "Select Profiling Task"(选择性能分析任务)窗口中,"Overhead"(开销)计数器将根据所选的性能分析选项粗略地估计性能分析开销的增减量。</p>
<p>在本练习中,将使用 IDE 分析 Anagram Game 应用程序的内存性能。您将选择 <b>Record both object creation and garbage collection</b>(同时记录对象创建和垃圾回收)选项,并选择 <b>Record stack traces for allocation</b>(记录分配的堆栈跟踪),以便于 IDE 记录完整调用堆栈。选择此选项后,在生成内存快照时,您可以在反向调用树中查看分配了对象的方法。</p>
<ol>
<li>在 "Profiler"(分析器)窗口中单击 "Stop"(停止)按钮,以停止前一个性能分析会话(如果仍在运行),并停止 Anagram Game 应用程序。</li>
<li>从主菜单中选择 "Profile"(性能分析)> "Profile Main Project"(分析主项目)。</li>
<li>在 "Select Profiling Task"(选择性能分析任务)对话框中选择 "Memory"(内存)。</li>
<li>选择 <strong>Record both object creation and garbage collection</strong>(同时记录对象创建和垃圾回收)。</li>
<li>使 "Track every N object allocations"(跟踪每第 N 个对象分配)保持为默认值 10。
<p>此选项可用于设置堆栈采样的间隔/比例。如果将值设置为 10,则意味着,对于每个类,每执行 10 个对象分配时,将只完整记录第 10 个对象分配。要记录每个对象的所有信息,可以将值设置为 1。不过,这会大大增加性能分析开销。</p></li>
<li>选择 <b>Record stack traces for allocation</b>(记录分配的堆栈跟踪)。单击 "Run"(运行)以启动性能分析会话。
<p>请注意,选择此选项时,"Overhead"(开销)计数器将大大增加,但应用程序非常小,因此性能影响应该可控。</p>
<img alt=""Select Profiling Task"(选择性能分析任务)对话框 - "Memory"(内存)" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/memory-task.png" title="选择内存性能分析任务" /></li>
</ol>
<p>单击 "Run"(运行)后,IDE 将启动应用程序,并开始性能分析会话。要查看性能分析结果,请在 "Profiler"(分析器)窗口中单击 "Live Results"(实时结果)以打开 "Live Results"(实时结果)窗口。"Live Results"(实时结果)窗口将显示与项目中所分配对象的大小和数量相关的信息。 </p>
<p>默认情况下,将按 "Live Bytes"(活动字节)数对结果进行排序和显示,但是,您可以单击列标题,以更改结果的显示方式。此外,还可以在列表下方的过滤器框中键入类名,对结果进行过滤。</p>
<img alt=""Memory Profiling Results"(内存性能分析结果)" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/memory-liveresults.png" title=""Memory Profiling Results"(内存性能分析结果)" width="580" />
</div>
<a name="snapshot"></a>
<h2>生成快照</h2>
<p>性能分析会话正在运行时,可通过生成快照捕获性能分析结果。生成快照时,快照可捕获性能分析数据。不过,快照在以下方面不同于实时性能分析结果:</p>
<ul>
<li>可以在性能分析会话没有运行时检查快照。</li>
<li>与实时结果相比,快照包含更详细的性能分析数据记录。</li>
<li>可以很方便地比较快照(内存快照)。</li>
</ul>
<p>无需运行性能分析会话即可打开项目的快照,因此,通过以下方式可以随时打开项目的快照:在 "Profiler"(分析器)窗口中,从已保存快照的列表中选择所需快照,然后单击 "Open"(打开)。</p>
<div class="indent">
<a name="takesnap"></a>
<h3>生成和比较内存快照</h3>
<p>对于 Anagram Game 应用程序,可以生成结果的快照,以查看类型为 <tt>String</tt> 的对象的分配堆栈跟踪。然后,可以生成另一个快照,并对二者进行比较。通过比较内存快照,可以查看在生成两个快照的时间间隔内从堆释放或创建的对象。快照必须可以进行比较,这意味着,性能分析类型(例如 "Allocations"(分配)与 "Liveness"(活动))和已跟踪的对象数必须匹配。</p>
<p>在本练习中,将生成快照并将其保存到项目中。然后,将生成第二个快照,并将该快照与已保存的快照进行比较。
</p>
<ol>
<li>确保性能分析会话仍在运行中。<br />(如果停止了性能分析会话,则重复执行相应步骤以分析内存性能并打开 "Live Results"(实时结果)窗口。)</li>
<li>在 "Live Results"(实时结果)窗口中,右键单击 <tt>java.lang.String</tt> 所在行,然后选择 "Take Snapshot and Show Allocation Stack Traces"(生成快照并显示分配堆栈跟踪)。
<p>IDE 将会生成内存快照,并在 "Allocation Stack Traces"(分配堆栈跟踪)标签中打开快照。在 "Allocation Stack Traces"(分配堆栈跟踪)标签中,可以在反向调用树中浏览实例化了选定对象的方法。</p>
<img alt="内存性能分析结果的屏幕快照" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/memory-snapshot1.png" title="内存性能分析结果的屏幕快照" /></li>
<li>单击快照工具栏中的 "Save Snapshot to Project"(将快照保存到项目中)按钮(Ctrl-S 组合键;在 Mac 上为 ⌘-S 组合键),将内存快照保存到项目中。将快照保存到项目中时,会在 "Profiler"(分析器)窗口中将该快照添加到 Anagram Game 的已保存快照的列表中。默认情况下,快照实际上保存在项目的 <tt>nbproject/private/profiler</tt> 目录中。已保存的快照会附加 <tt>.nps</tt> 后缀。
<p class="notes"><b>注:</b>您可以将快照保存到文件系统上的任何位置,但只有保存在项目中默认位置的快照才会列在 "Profiler"(分析器)窗口中。此外,还可以单击快照工具栏中的 "Save current view to image"(将当前视图另存为图像)按钮,将快照保存为可以在 IDE 外部查看的图像文件 (<tt>.png</tt>)。</p>
</li>
<li>生成另一个快照,方法是:单击 "Live Results"(实时结果)工具栏中的 "Take Snapshot of Collected Results"(生成收集结果的快照)按钮(或者,也可以在 "Profiler"(分析器)窗口中单击 "Take Snapshot"(生成快照)按钮)。保存该快照。</li>
<li>在某一内存快照的窗口中,单击快照工具栏中的 "Compute Difference"(计算差异)按钮 (<img alt=""Compare Snapshot"(比较快照)按钮" src="../../../images_www/articles/72/java/profile-intro/comparesnapshots.png" style="vertical-align:bottom;margin-top:2px;" title=""Compare Snapshot"(比较快照)按钮" />)。此外,也可以从主菜单中选择 "Profile"(性能分析)> "Compare Memory Snapshots"(比较内存快照)。</li>
<li>在 "Select Snapshot to Compare"(选择要比较的快照)中,从列表中选择其中一个打开的快照。单击 "OK"(确定)。<br> <img alt="用于选择要比较的快照的对话框的屏幕快照" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/select-snapshot.png" title=""Select Snapshots to Compare"(选择要比较的快照)对话框" />
<p>内存快照处于打开状态时,可以将其与其他可比较的内存快照进行比较。您可以将该快照与当前打开的未保存快照进行比较,也可以将其与保存到项目或系统中其他位置的快照进行比较。</p>
<p>单击 "OK"(确定)后,将会打开 "Liveness Comparison"(活动比较)窗口,其中会显示两个内存快照之间的差异。</p>
<img alt="活动比较结果的屏幕快照" class="margin-around box" src="../../../images_www/articles/72/java/profile-intro/memory-compare.png" title="显示两个内存快照的活动比较结果的标签" /></li>
</ol>
<p>快照比较类似于内存快照,但只显示两个比较快照之间的差异。通过 "Live Bytes"(活动字节)列中的图形栏,可以轻松查看分配的字节的差异。如果该列中单元格的左半部分为绿色,则表示生成第二个快照时为该对象分配的字节数小于生成第一个快照时为其分配的字节数。如果该单元格的右半部分为红色,则表示第二个快照中分配的字节数大于第一个快照中分配的字节数。在其他列中,可以看到加号 (+) 表示值增加,而减号 (-) 表示该值减小。
</p>
<p class="notes"><strong>注:</strong>您还可以设置生成快照性能分析点,以便更精确地控制生成快照的时间。有关如何使用性能分析点生成快照的详细信息,请参见<a href="../../docs/java/profiler-profilingpoints.html">在 NetBeans IDE 中使用性能分析点</a></p>
</div>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Introduction%20to%20Profiling">发送有关此教程的反馈意见</a></div>
<br style="clear:both;">
<a name="seeAlso"></a>
<h2>另请参见</h2>
<p>使用 NetBeans IDE 对应用程序进行性能分析的简介到此结束。本文档介绍了如何使用 IDE 对简单的 NetBeans 项目进行性能分析并查看性能分析结果的基本知识。对大多数项目进行性能分析时,上述步骤可能都适用。如果对企业应用程序和自由格式项目等更复杂的项目进行性能分析,则可能需要执行额外的配置步骤。</p>
<p>有关本文档中未介绍的性能分析设置和功能的更详细信息,请查阅相关文档,后者是该产品附带的,可从 "Help"(帮助)菜单项获得。<p>
<p>有关相关文档,请参见以下资源:</p>
<ul>
<li><a href="http://wiki.netbeans.org/wiki/view/NetBeansUserFAQ#section-NetBeansUserFAQ-Profiler">Netbeans 分析器常见问题解答</a><br /> 一个包含在 NetBeans IDE 中对应用程序进行性能分析的常见问题的文档</li>
<li><a href="http://wiki.netbeans.org/wiki/view/FaqProfilerProfileFreeForm">常见问题解答:对自由格式项目进行性能分析</a></li>
<li><a href="profiler-screencast.html">截屏视频:性能分析点、进一步浏览图和堆查看器</a><br /> 介绍 NetBeans IDE 中的一些性能分析功能的演示。</li>
<li><a href="../../../community/magazine/html/04/profiler.html">高级性能分析:理论应用实践</a></li>
<li><a href="http://www.javapassion.com/handsonlabs/nbprofilermemory/">使用 NetBeans 分析器查找内存泄漏</a><br /> <a href="http://www.javapassion.com/">JavaPassion 站点</a>上的操作实验</li>
<li><a href="http://profiler.netbeans.org/index.html">profiler.netbeans.org</a><br /> Netbeans 分析器项目站点</li>
<li><a href="http://blogs.oracle.com/nbprofiler">Netbeans 分析器博客</a></li>
<li><a href="http://profiler.netbeans.org/mailinglists.html">Netbeans 分析器邮件列表</a></li>
</ul>
<p class="align-center"><a href="#top">返回页首</a></p>
</body>
</html>