NetBeans IDE 6.0 包含一个强大的性能分析工具,可提供与应用程序运行时行为有关的重要信息。通过 NetBeans 性能分析工具,我们可以方便地在 IDE 中监控应用程序的线程状态、CPU 性能以及内存使用情况,而且产生的开销相对较少。

本文将概述 IDE 中包含的性能分析工具,并指导您快速开始分析 NetBeans 项目的性能。本文旨在演示 IDE 中可用的各种性能分析任务以及分析项目性能时可以获得的分析结果。但并不覆盖 IDE 中包含的所有性能分析功能,也不会深入探索如何研究性能分析结果以解决应用程序中存在的特定执行问题。

在本文档中,我们将使用性能分析工具获得有关 Anagram Game 示例应用程序的性能分析数据,该应用程序是 IDE 提供的一个简单 Java 应用程序。尽管 Anagram Game 是一个非常简单的 Java 应用程序项目,但是当您分析更大、更复杂的 Java 应用程序以及 Web 和企业应用程序项目时,仍然需要遵循同样的步骤。

本文档将演示如何使用 IDE 来分析应用程序并获得以下分析结果:

  • 应用程序的运行时行为
  • 应用程序方法占用的 CPU 时间
  • 对象创建

另外,本文档还将演示如何创建分析结果快照,并比较分析结果。

预计时间: 40 分钟

目录:

前提条件

本文档假定您拥有以下技术的基本知识或者具备相关编程经验:

  • Java 编程
  • NetBeans IDE

本教程所需要的软件

要使用本教程,您需要在计算机上安装以下软件:

  • NetBeans IDE 6.0(下载)。
  • Java Standard Development Kit (JDK) 5.0 版或 6.0 版(下载

NetBeans IDE 绑定了本性能分析工具,因此不需要任何特殊步骤就可以开始分析应用程序的性能。

初次分析性能

第一次使用性能分析工具时,IDE 需要执行一些初始化操作,以确保可以获得精确的分析结果并将该工具和项目集成在一起。为展示这一点,我们首先将创建 AnagramGame 项目,然后运行校准。第一次分析 AnagramGame 项目的性能时,IDE 将会自动执行集成。

创建示例项目

在本文档中,我们将分析 Anagram Game 示例应用程序的性能。为了完成此任务,首先使用 New Project 向导创建该示例应用程序。

要创建 Anagram Game 应用程序,请执行以下步骤:

  1. 从主菜单选择 File > New Project 选项。
  2. 在 New Projects 向导中,选择 Samples > Java 类别。
  3. 选择 Anagram Game 项目。
  4. 指定项目位置并确保选中 Set as Main Project 属性。单击 Save 按钮。

单击 Finish 按钮,IDE 将创建一个 Anagram Game 示例项目。您将可以在 Projects 窗口看到 Anagram Game 项目,并且该名称显示为粗体,表示该项目被设为主项目。默认情况下,使用 IDE 分析项目性能时,IDE 将分析主项目的性能。

初次使用性能分析器

为了获得精确的分析结果,我们必须拥有用于性能分析的每个 Java 平台的校准数据。如果是第一次运行性能分析工具,或者无法获得该 Java 平台的有效校准数据,系统会提示为您的平台运行校准进程。

校准只需要执行一次。但是,如果您对机器的配置进行了任何可能影响其性能的重大更改,则需要再次运行校准。您可以通过执行以下步骤在任何时候运行校准:

  1. 选择 Profiler > Advanced Commands > Run Profiler Calibration 选项。
  2. 选择 Java Platform 选项。单击 OK 按钮。

校准操作完成后,会出现一个对话框,显示有关校准结果的信息。每个 Java 平台的校准数据保存在主目录中的.nbprofile 目录中。

初次分析项目性能

第一次分析项目的性能时,您将会看到一个对话框,提示 IDE 需要将性能分析工具和目标项目集成。为了与项目集成,IDE 会修改项目的构建脚本,为所需的性能分析库导入一个其他的构建脚本。在修改构建脚本之前,IDE 会创建一个原构建脚本的备份。

要和项目集成性能分析工具,在对话框中单击 OK 按钮。IDE 将创建一个 build.xml 的备份,其名称为 build-before-profiler.xml,并将以下行添加到 build.xml 中:

<import file="nbproject/profiler-build-impl.xml"/>

您可以通过从主菜单中选择 Profiler > Advanced Commands > Unintegrate 选项来恢复原构建脚本。

选择性能分析任务

IDE 提供了很多内部设置,我们可以根据自己的需要来调整性能分析。例如,您可以通过减少生成信息的总量来降低性能分析的开销。但是,您可能需要一些时间才能理解众多可用设置的意义和用法。对于很多应用程序,为性能分析任务指定的默认设置在大多数情况下已经够用了。

对项目进行性能分析时,根据您想要获得的分析信息的类型,使用 Select Profiling Task 对话框选择任务。下表说明了性能分析任务以及从运行该任务获得的分析结果。

性能分析任务 结果
监控应用程序 选择此任务以获得有关目标 JVM 属性的高级信息,包括线程活动和内存分配。
分析 CPU 性能 选择此任务以获得有关应用程序执行的详细信息,包括执行方法的时间和方法被调用的次数。
分析内存使用情况 选择此任务以获得有关对象分配和垃圾回收的详细信息。

Select Profiling Task 对话框是运行性能分析任务的主界面。选择任务后,您可以修改任务设置以进一步调节您将获得的结果。对于每个性能分析任务,您也可以根据该任务创建并保存自 定义性能分析任务。您创建自定义性能分析任务时,该自定义任务会在显示在 Select Profiling Task 对话框的列表中,便于以后轻松查找和运行您的自定义设置。您创建自定义性能分析任务后,您可以通过单击 Select Profiling Task 对话框中的Advanced settings 选项来修改更多高级分析设置。

现在,我们将分析 Anagram Game 的性能并展示每个性能分析任务。

监控应用程序

当您选择 Monitor 任务时,不需要任何工具就可以启动目标应用程序。监控应用程序时,您将获取有关目标 JVM 的许多重要属性的高级信息。由于监控应用程序开销很小,因此可以在此模式下长时间运行应用程序。

要监控 Anagram Game 应用程序,请执行以下步骤:

  1. 确保将 AnagramGame 设置为主项目。
  2. 从主菜单选择 Profile > Profile Main Project 选项。
  3. 在 Select Profiling Task 对话框中选择 Monitor 选项。
  4. 单击 Run 按钮。

单击 Run 按钮后,IDE 会启动应用程序,并且 Profiler 窗口会在 IDE 的左窗格打开。Profiler 窗口包含一些控制器,我们可以执行以下操作:

  • 控制性能分析任务
  • 查看当前性能分析任务的状态
  • 显示分析结果
  • 管理分析结果快照
  • 查看基本遥测统计数据

您可以使用 Profiler 窗口中的控制器或主菜单来打开可以在其中查看监控数据的窗口。您可以使用 Telemetry Overview 窗口快速实时获得监控数据的概览。

  • 依次选择 Window > Profiling > Telemetry Overview 选项,在 Output 窗口中打开概览。
    您可以在任何分析会话期间随时打开 Telemetry Overview 窗口并查看监控数据。

Telemetry Overview 可用于快速查看应用程序的状态。将光标置于某个图表之上,我们可以看到有关图表中显示的数据的更多详细统计数据。您可以单击 Telemetry Overview 窗口中的任何图表,以打开更大、有更多详细信息的图表。

分析 CPU 性能

当您选择 CPU 任务时,IDE 会对应用程序的的方法级的 CPU 性能(执行时间)进行分析,并实时处理结果。您可以选择分析整个应用程序的性能,或者只分析部分应用程序代码,甚至只分析某个特定代码片段。

要分析 CPU 性能,您可以通过选择以下选项之一确定如何分析应用程序:

  • Entire Application。在这种模式下,分析应用程序的所有方法都要被监测。当线程进入和退出项目方法时 IDE 会进行记录,使您可以查看每个方法花费了多少时间。
  • Part of Application。在这种模式下,您可以监测并分析应用程序代码的有限子集。这可以大大降低分析的开销。

    要对应用程序的一部分进行性能分析,首先需要指定一个或多个根方法。根方法是在源代码中指定为 Instrumentation 根的方法、类或包。当应用程序的一个线程进入和离开 Instrumentation 根时,系统针收集分析数据。在应用程序的线程进入根方法之前,不会收集任何分析数据。

    注意:对于一些程序,此选项可能是获得任何详细和/或真实性能数据的唯一方法,因为分析整个应用程序可能会生成太多分析数据,以至于应用程序变得无法使用或者可能甚至引起崩溃。

您也可以通过使用过滤器限制监测的源代码,进一步微调分析多少代码。

现在您可以使用 IDE 来分析 Anagram Game 应用程序的 CPU 性能了。您将选择 Part of Application 选项,然后选择 WordLibrary.java 为分析根。通过选择此类为分析根,可以将分析限制在此类中的方法。

  1. 通过单击 Profiler 窗口中的 Stop 按钮停止先前的分析会话(如果仍然在运行)。
  2. 从主菜单选择 Profile > Profile Main Project 选项。
  3. 在 Select Profiling Task 对话框中选择 CPU 选项。
  4. 选择 Part of Application 选项。
    要使用此选项,您也需要指定分析根方法。
  5. 单击 define 按钮打开 Specify Root Methods 对话框。
  6. 单击 Add From Project 按钮打开 Select Root Methods 对话框。
  7. 在 Select Root Methods 对话框中,展开 AnagramGame 节点并选择Sources/com/toy/anagrams/lib/WordLibrary。单击 OK 按钮。
     
  8. 单击 Specify Root Methods 对话框中的 OK 按钮。
    您可以看到 WordLibrary 被列为根方法。
    在 Select Profiling Task 框中,您可以看到一个根方法被指定为分析根。当分析项目时,您可以指定多个根方法。您也可以单击 edit 按钮来修改所选根方法。
  9. 选择 Profile only project classes 选项作为 Filter 字段的值。
    该过滤器使您可以限制被监测的类,在本例中限制到项目中找到的类。您可以单击 Show filter value按钮来查看过滤类的列表。您可以从 IDE 的预定义分析过滤器中选择或者创建自己的自定义过滤器。
  10. 在 Select Profiling Task 对话框中单击 Run 按钮。

单击 Run 按钮后,IDE 会启动应用程序并开始分析会话。要查看分析结果,单击 Profiler 窗口中的 Live Results 按钮来打开 Live Profiling Results 窗口。Live Profiling Results 窗口会显示迄今为止收集到的分析数据。默认情况下显示的数据每隔几秒钟就会刷新一次。当分析 CPU 性能时,Live Profiling Results 窗口会显示有关每个方法花费的时间以及每个方法的调用次数的信息。您可以看到在我们的 Anagram Game 应用程序中最初仅有两个方法被调用。

如果您尝试解开 Anagram Game 中的一些字谜,您可以看到 IDE 会显示我们的操作正在调用的其他方法以及应用程序在每个方法上花费的时间。

通过右键单击方法的名称并选择 Go To Source,您可以快速浏览到包含任何列出的方法的源代码。单击 Go To Source 按钮时,该类会在 Source 编辑器中打开。

分析内存使用情况

分析内存使用情况任务会给您提供有关在目标应用程序中被分配的对象的数据,比如被分配对象的数目、类型和位置。

要分析内存性能,您可以通过选择以下选项之一确定想要获取多少数据:

  • Record object creation only。当选择此选项时,当前由目标 JVM 加载的所有类(以及实际加载的每个新类)都会被监测,以生成有关对象分配的信息。
  • Record both object creation and garbage collection。当选择此选项时,分析应用程序会给您提供有关对象活跃度的信息,比如有关每个类型的对象由多少仍然是活动的、它们的大小和平均年龄以及分配数据。

第一个选项是第二个的功能子集,并且具有更小的性能和内存开销。Select Profiling Tasks 窗口中的 Overhead 测量仪可以根据您选择的分析选项大致给出分析开销的增长或降低。

现在我们可以使用 IDE 来分析 Anagram Game 应用程序的内存性能了。您将选择 Record both object creation and garbage collection 选项。您也将选择 Record stack traces for allocation,这样 IDE 会记录整个调用堆栈。通过选择此选项,当您创建内存快照时,您将可以查看分配了对象的方法调用的相反的调用树。

  1. 单击 Profiler 窗口中的 Stop 按钮停止先前的分析会话(如果仍然在运行)。
    单击 Stop 按钮时,Anagram Game 应用程序也会停止。
  2. 从主菜单选择 Profile > Profile Main Project 选项。
  3. 在 Select Profiling Task 对话框中选择 Memory 选项。
  4. 选择 Record both object creation and garbage collection 选项。
  5. Track every N object allocations 的值仍保持为默认值 10。

    此选项设置了堆栈取样的时间间隔/ 比例。通过将该值设为 10,则表示对于每个类,每隔 10 个对象才有一个将被完整记录。要记录每个对象的所有信息,您可以将该值设置为 1.但是这将显著增加分析开销。

  6. 选择 Record stack traces for allocation 选项。
    请注意,当您选择此选项时,Overhead 测量仪会显著增加,但是我们的应用程序足够小,应该可以管理其性能高峰。
  7. 单击 Run 按钮。   

单击 Run 按钮后,IDE 会启动应用程序并开始分析会话。要查看分析结果,单击 Profiler 窗口中的 Live Results 按钮来打开 Live Profiling Results 窗口。Live Profiling Results 窗口显示有关分配到项目中的对象的大小和数量的信息。

默认情况下,结果会按 Live Bytes 的大小来存储和显示,但是您可以单击列标题来更改结果显示的方式。您也可以通过在列表下面的过滤器框中键入一个类名来过滤结果。

创建快照

当正在进行分析会话时,您可以通过创建快照来捕获分析结果。快照可以捕获您创建该快照时的分析数据。但是,快照与活动的分析结果在以下方面也有所不同:

  • 当无分析会话运行时,可以对快照进行分析。
  • 快照比活动的结果包含更详细的分析数据记录。
  • 快照更容易比较(内存快照)。

由于打开项目的快照并不一定需要分析会话正在运行,因此您可以通过在 Profiler 窗口中选择已保存快照列表中的快照,并单击 Open 随时打开项目的快照。

创建和比较内存快照

对于 Anagram Game 应用程序,我们想要创建结果的快照,并查看 String 类型对象的分配堆栈轨迹。然后我们想要再创建一个快照,并对两个快照进行比较。如果打开了内存快照,您可以将其与项目中或在系统的其他地方保存的内存快照进行比较。

  1. 确保分析会话仍在运行。
    (如果您停止了分析会话,请重复以上步骤,以分析内存性能并打开 Live Profiling Results 窗口。)
  2. 右键单击 Profiling Results 窗口中包含 java.lang.String 的行,并选择 Take Snapshot and Show Allocation Stack Traces。
    IDE 创建内存快照并在 Allocation Stack Traces 选项卡上将其打开,您可以在该选项卡上浏览呈现此对象的方法的反调用树。
  3. 单 击快照工具栏上的 Save Snapshot to Project 按钮(或者 Ctrl+S),将该内存快照保存到项目中。当您将快照保存到项目中时,该快照被添加到 Anagram Game 的 Profiler 窗口中的已保存快照列表中。默认情况下,快照实际上被保存在项目的 nbproject/private/profiler 目录。已保存快照的后缀为 .nps

    注意:您可以将快照保存到文件系统上的任何地方,但是只有保存在项目中默认位置的快照会在 Profiler 窗口中列出。您也可以将快照保存为图像文件 (.png),这些图像文件可以在 IDE 的外面查看。

  4. 通过单击 Live Profiling Results 工具栏上的 Take Snapshot of Collected Results 按钮创建其他快照(或者单击 Profiler 窗口中的 Take Snapshot 按钮)。保存快照。
  5. 在其中一个内存快照的窗口中,单击快照工具栏上的 Compute Difference 按钮()。
  6. 选择 Select Snapshot to Compare 对话框中的第二个内存快照并单击 OK 按钮。
    Liveness Comparison 窗口即打开,显示两个内存快照之间的不同。

转载:http://blog.sina.com.cn/s/blog_53f1134f01008isb.html

相关文章:https://netbeans.org/kb/docs/java/profiler-intro_zh_CN.html

有关相关文档,请参见以下资源:

在 NetBeans IDE 6.0 中分析 Java 应用程序性能的更多相关文章

  1. 在Docker中监控Java应用程序的5个方法

    译者注:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.通常情况下,监控的主要目的在于:减少宕机 ...

  2. android 4.0 中出错 java.lang.UnsupportedOperationException

    在android4.0中  画图的时候使用: canvas.clipPath(path, Region.Op.XOR); 报错 java.lang.UnsupportedOperationExcept ...

  3. (转) Python in NetBeans IDE 8.0

    原地址: https://blogs.oracle.com/geertjan/entry/python_in_netbeans_ide_8 Copy this to the clipboard: ht ...

  4. 在 Azure Web 应用中创建 Java 应用程序

    本分步指南将通过 Azure Web 应用帮助您启动并运行示例 Java 应用程序.除 Java 外,Azure Web 应用还支持其他语言,如 PHP..NET.Node.JS.Python.Rub ...

  5. IIS7.0中Process打开cmd程序出现问题

    本人在VS中用Process打开cmd程序,并传入参数,转换图片,运行成功! 但是放入IIS7.0中,Process打不开cmd程序,程序直接运行过去,无结果,无报错! 解决方案: 将IIS里面你程序 ...

  6. tomcat中设置Java 客户端程序的http(https)访问代理

    1.假定http/https代理服务器为 127.0.0.1 端口为8118 2.在tomcat/bin/catalina.sh脚本文件中设置JAVA_OPTS,如下图: 保存后重启tomcat就能生 ...

  7. Quartus prime 16.0 中通过JTAG固化程序

    前言 下载项目sof文件到开发板中,掉电后会消失:由于开发板有JTAG口,则可以用JTAG固化jic文件到EPCS16芯片中. 流程 1.打开quartus软件并打开convert programmi ...

  8. 如何提高Java并行程序性能??

    在Java程序中,多线程几乎已经无处不在.与单线程相比,多线程程序的设计和实现略微困难,但通过多线程,我们却可以获得多核CPU带来的性能飞跃,从这个角度说,多线程是一种值得尝试的技术.那么如何写出高效 ...

  9. Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制

    新的锁定类提高了同步性 —— 但还不能现在就抛弃 synchronized JDK 5.0为开发人员开发高性能的并发应用程序提供了一些很有效的新选择.例如,java.util.concurrent.l ...

随机推荐

  1. MySql: 常见错误

    1.  No query specified 出现此错误是sql不合法原因:比如: mysql> select * from t\G;*************************** 1. ...

  2. Intellij IDEA 常用快捷键

    [常规] Ctrl+Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更 ...

  3. centos查看硬件信息

    服务器硬件信息常见, 是经常要操作的事: 下面分享一些常见的硬件查看命令: 1.centos 下查看硬件信息内容非常全面. CentOS常用命令查看cpu more /proc/cpuinfo 2.C ...

  4. 桂电在线-php-提取菜单到配置文件

    新建存储菜单的配置文件 menus.php,并配置菜单 <?php if ( ! defined('BASEPATH')) exit('No direct script access allow ...

  5. 学习笔记--【转】Parameter与Attribute的区别&amp;servletContext与ServletConfig区别

    原文链接http://blog.csdn.net/saygoodbyetoyou/article/details/9006001   Parameter与Attribute的区别   request. ...

  6. android Canvas drawText 文字居中

    1首先利用canvas获取画布的宽高, //获取屏幕的宽和高int width = canvas.getWidth();int height = canvas.getHeight(); 2获取文字的宽 ...

  7. python 编码规范 (http://www.runoob.com/w3cnote/google-python-styleguide.html)

    命名约定 所谓"内部(Internal)"表示仅模块内可用, 或者, 在类内是保护或私有的. 用单下划线(_)开头表示模块变量或函数是protected的(使用import * f ...

  8. HashMap的源码,实现原理,底层结构

    转载一遍不错的文章,让你深入了解HashMap http://www.cnblogs.com/ITtangtang/p/3948406.html

  9. poj 3294 Life Forms - 后缀数组 - 二分答案

    题目传送门 传送门I 传送门II 题目大意 给定$n$个串,询问所有出现在严格大于$\frac{n}{2}$个串的最长串.不存在输出'?' 用奇怪的字符把它们连接起来.然后求sa,hei,二分答案,按 ...

  10. 第16月第8天 NSInvocation存储 函数指针 va_arg lldb

    1.NSInvocation存储 -(void)setInvok:(id)target sel:(SEL)sel key:(id)key { if(!target) return; NSMethodS ...