Java 开发者的 NetBeans IDE 入门手册(二)

原文:Beginning NetBeans IDE for Java developers

协议:CC BY-NC-SA 4.0

八、故障排除

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我喜欢 NetBeans 的一点是它不断追求创新。NetBeans 调试器是第一个提供混合语言支持(例如 Java/JavaScript)的,并将很快帮助为 Oracle 实验室基于新的 Truffle 框架构建的任何语言提供现成的调试,例如 JRuby、FastR、Python 等!—Jaroslav Tulach,NetBeans 的创始人

NetBeans IDE 提供了一个丰富的环境,用于识别错误、排除瓶颈故障以及优化 Java 应用中的代码。内置的 Java 调试器允许您在 Java 代码执行的同时逐步调试您的 Java 代码,使您能够监视正在运行的应用的各个方面,例如它的变量值、它的方法调用的当前序列、它的线程状态以及它的对象的创建。

当使用调试器时,如图 8-1 所示,你没有理由用System.out.println语句来诊断应用中出现的问题。(使用前面章节中描述的“检查&转换”功能来识别并删除所有的System.out.println语句。)相反,您可以使用调试器来指定代码中带有断点的“关注点”(断点不存储在代码中,而是存储在 IDE 中),在这些断点处暂停程序,并使用 IDE 中的调试工具来评估正在运行的程序的当前状态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-1。

NetBeans Debugger

此外,您可以在调试时更改代码,并动态地将类重新加载到调试器中,而无需重新启动调试会话。

表 8-1 列出了您可以使用调试器执行的活动。

表 8-1。

Debugger Activities

| 活动 | 描述 | | --- | --- | | 步骤 | 逐句通过应用代码,包括 JDK 源代码。需要时,您可以在当前调用栈中退回到以前调用的方法的开头(“弹出”调用)。 | | 执行 | 使用断点作为分隔符,一次执行特定的代码块。 | | 暂停 | 当满足指定的条件时暂停执行,例如当迭代器达到某个值时,或者在导致异常的代码行或异常本身处暂停执行。监视线程时,可以单独或集体挂起它们。 | | 轨道 | 通过“监视”功能跟踪变量或表达式的值或变量引用的对象。 | | 应用 | 动态应用代码更改并继续调试会话。 | | 识别 | 识别和分析死锁。 | | 奔跑 | 可以同时运行单个或多个调试会话。 |

入门指南

调试器使您能够在称为“断点”的关键点暂停程序的执行,并检查变量值、线程状态等。一旦在断点处暂停执行,就可以一行一行地单步执行代码。

开始调试程序包括以下步骤。

Determine the “point of interest” in your code where you want to start debugging and set a breakpoint at that line by clicking in the left margin of that line. A red icon appears in the left margin to mark the breakpoint. In addition, the whole line is highlighted in red.   Start the Debugger by choosing Debug Project or by pressing Ctrl+F5. The IDE builds (or rebuilds) the application and then opens up Debugger windows, by default in the lower half of the IDE.   When the execution of the program stops at the breakpoint, which you can see when the red breakpoint highlight is replaced by the green highlight, you can use the buttons in the toolbar, or their related keyboard shortcuts, to step through the code line by line while viewing the status of variables, threads, and other information.   Observe the program flow, while monitoring and analyzing the evolving values of variables in the Variables window.   Based on your analysis, fix your code and, where applicable, apply code changes and continue the debugging session.

或者,除了设置断点之外,您还可以使用另外两个在特定情况下可能有用的工具来开始调试程序。

  • 运行到光标处。在源代码编辑器中,单击要暂停执行的行,然后单击工具栏中的“运行到光标处”。仅当您选择项目主类中的一行代码或主项目中由主类直接调用的类时,此命令才可用于启动调试会话。
  • 调试文件。如果项目中有多个可执行类,有时您可能希望从指定为项目主类的类之外的类启动调试器。要在项目主类以外的类上启动调试器,请在“项目”窗口或“文件”窗口中右键单击文件的节点,然后选择“调试文件”。如果文件有 main 方法,则只能对该文件启动调试器。

调试器窗口

开始调试程序时,会出现各种调试器窗口。调试器窗口记录被调试程序的执行状态,例如代码是否在断点处停止。“输出”窗口中会打开选项卡,用于记录任何应用输出,以及 IDE 在运行命令时使用的脚本的输出。

调试器窗口(如监视、变量和调用栈)以选项卡的形式打开,并提供有关调试会话的当前信息,如变量的当前值和当前方法调用的列表。它们在表 8-2 中描述。还可以通过从“窗口”“➤调试”菜单中选择来打开各个调试窗口。

表 8-2。

Debugger Windows

| 工具 | 始于 | 描述 | | --- | --- | --- | | 变量 | Alt+Shift+1 | 显示调试器当前上下文中的所有字段和局部变量及其当前值。该节点下列出了字段。 | | 手表 | Alt+Shift+2 | 显示您已监视的字段、局部变量或表达式的名称。尽管无论当前上下文如何,都会显示您的所有监视,但显示的值是该上下文的值(而不是设置监视的上下文的值)。例如,如果您有一个对`this`关键字的监视,那么在监视窗口中引用的`this`将总是对应于从当前方法调用中引用的对象。 | | 调用栈 | Alt+Shift+3 | 显示当前调用链中的所有方法调用。“调用栈”窗口使您能够直接跳转到方法调用的代码,将程序的执行备份到以前的方法调用,或者选择一个上下文来查看局部变量值。 | | 班级 | Alt+Shift+4 | 为当前调试的应用提供按类加载器分组的类的树视图。 | | 断点 | Alt+Shift+5 | 显示您在所有正在运行的调试会话中设置的所有断点。 | | 线 | Alt+Shift+6 | 显示当前会话中的线程。在此窗口中,您可以通过将另一个线程指定为当前线程来切换上下文。 | | 会议 | Alt+Shift+7 | 为 IDE 中的每个调试会话显示一个节点。在此窗口中,您可以切换当前会话。 | | 来源 | Alt+Shift+8 | 显示可用于调试的源代码,并使您能够指定要使用的源代码。例如,您可以使用此窗口来启用对 JDK 源代码的调试。 |

大多数调试器窗口根据调试器的当前上下文显示值。通常,当前上下文对应于一个会话中一个线程中的一个方法调用。您可以更改上下文(例如,在“线程”窗口中指定不同的当前线程),而不会影响被调试程序的运行方式。

步伐

一旦程序暂停,有几种方法可以恢复代码的执行。您可以逐行(逐步)或以更大的增量单步执行代码,如表 8-3 所示。

表 8-3。

Debugger Steps

| 步进命令 | 捷径 | 描述 | | --- | --- | --- | | 进入 | F7 | 执行当前行。如果该行是对方法或构造函数的调用,并且有可供被调用代码使用的源代码,则程序计数器移到方法或构造函数的声明。否则,程序计数器移动到文件中的下一行。 | | 跨过 | F8 | 执行当前行并将程序计数器移动到文件中的下一行。如果执行的行是对方法或构造函数的调用,则方法或构造函数中的代码也会被执行。 | | 走出去 | Ctrl+F7 | 执行当前方法或构造函数中的其余代码,并将程序计数器移动到方法或构造函数的调用方之后的行。如果您已经单步执行了不需要分析的方法,此命令非常有用。 | | 运行到光标处 | 法乐四联症 | 在源代码编辑器中执行程序中当前行和插入点之间的所有行。 | | 中止 | - | 停止当前会话中的所有线程。 | | 继续 | Ctrl+F5 | 继续执行程序,直到下一个断点。 |

逐行执行代码

通过选择“调试➤单步执行”(F7),可以让调试器一次单步执行一行。

如果在方法调用中使用“单步执行”命令,调试器将进入该方法并在第一行暂停,除非该方法是尚未指定在调试器中使用的库的一部分。

执行一个方法而不单步执行它

通过选择“调试➤单步调试”(F8),可以执行方法,而无需调试器在方法中暂停。

使用“单步执行”命令后,调试器在方法调用后的行再次暂停。

在方法结束时继续执行

如果已经单步执行了不需要继续分析的方法,可以让调试器完成该方法的执行,然后在方法调用后的行处再次暂停。

要以这种方式完成方法的执行,请选择“调试➤单步执行(Ctrl+F7)”。

继续到下一个断点

如果在调试时不需要观察每一行代码,可以继续执行,直到下一点,或者直到执行被挂起。

若要继续执行已在断点处暂停的程序,请选择“调试”“➤”“继续”或按 F5。

继续到光标位置

当执行暂停时,您可以继续执行特定的行,而不设置断点,方法是将光标放在该行,然后选择“调试➤运行到光标处”(F4)。

走进 JDK 和其他图书馆

调试时,如果在 IDE 的库管理器中注册了与 JDK 和任何其他库相关联的源代码,就可以单步执行这些库的代码。

默认情况下,在调试时,IDE 不会单步执行 JDK 源代码。如果在 JDK 方法调用中使用“单步执行”命令,IDE 将执行该方法,并将程序计数器返回到方法调用后的行(就像使用“单步执行”命令一样)。

若要允许单步执行已调试应用的 JDK 源代码,请启动该应用的调试器,然后通过从“窗口”菜单的“调试”菜单中选择“源代码”或按 Alt-Shift+8 打开“源代码”窗口。选中 JDK 的“用于调试”复选框。

限制可以进入库的类

如果您使用库进行调试,可以设置一个筛选器来排除一些正在使用的源代码。

要排除在调试器中使用的类,首先要启动应用的调试器。通过从“窗口”菜单的“调试”菜单中选择“源代码”或按 Alt-Shift+8 打开“源代码”窗口。右键单击要为其创建排除过滤器的库所在的行,然后选择“添加类别排除过滤器”。

在“添加类别排除筛选器”对话框中键入一个筛选器。过滤器可以是以下一种或多种:

  • 完全限定的类名。
  • 末尾带有星号(*)的包名或类名,用于创建通配符。例如,您可以键入以下命令来排除javax.swing包中的所有类:javax.swing.*

以通配符开头的表达式。例如,要排除名称末尾有Test的所有类,可以使用*Test

您可以创建多个类别排除过滤器。

若要禁用该过滤器,请在“源代码”窗口中取消选择该过滤器旁边的“在调试中使用”复选框。

要删除类别排除过滤器,请右键单击该过滤器,然后选择删除。

从一个方法备份到它的调用

在某些情况下,退回到代码中可能会有用。例如,如果您遇到了一个断点,并且想要查看通向该断点的代码是如何工作的,您可以从调用栈中移除(“弹出”)当前调用,以重新执行该方法。

您可以打开“调用栈”窗口,查看当前线程中当前方法调用链内的所有方法调用。当前呼叫标有图标。栈中的其他调用用图标标记。

若要备份到上一个方法调用,请打开“调用栈”窗口(Alt+Shift+3),右键单击“调用栈”窗口中代表代码中要返回的位置的那一行,然后选择“弹出到此处”。程序计数器返回到发出呼叫的线路。然后,您可以重新执行该方法。要备份到最近的方法调用,还可以从“调试”菜单的“栈”菜单中选择“弹出最顶层调用”。

断点

如图 8-2 所示,断点是一个标记,当您在调试器中运行应用时,您可以设置它来指定执行应该暂停的位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-2。

Breakpoint

断点存储在 IDE 中,而不是存储在应用的代码中,并且在调试会话和 IDE 会话之间保持不变。

设置断点

当执行在断点处暂停时,执行暂停的行在源代码编辑器中以绿色突出显示,如图 8-3 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-3。

Paused execution

调试器控制台会打印一条消息,如图 8-4 所示,其中包含已到达断点的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-4。

Message printed in the Debugger Console

最简单的形式是,断点提供了一种在特定点暂停正在运行的程序的方法。当程序到达断点时,您可以执行表 8-4 中列出的活动和诊断任务。

表 8-4。

Breakpoint Tasks

| 工作 | 描述 | | --- | --- | | 班长 | 在程序执行的那一点监控变量的值。 | | 控制 | 通过逐行或逐个方法单步执行代码来控制程序的执行。 | | 检测变化 | 检测字段或局部变量的值何时更改(例如,这可以帮助您确定代码的哪一部分为字段分配了不适当的值)。 | | 检测创作 | 检测对象的创建时间(例如,在试图跟踪内存泄漏时,这可能很有用)。 |

您可以设置多个断点,并且可以设置不同类型的断点。

最简单的断点类型是行断点,其中程序的执行在特定行停止。您还可以在其他情况下设置断点,例如调用方法、引发异常或更改变量值。此外,您可以在某些类型的断点中设置条件,以便它们仅在特定情况下暂停程序的执行。

断点类型汇总见表 8-5 。

表 8-5。

Breakpoint Types

| 类型 | 描述 | | --- | --- | | 线条 | 在一行代码上设置。当调试器到达该行时,它会在执行该行之前停止。断点以红色背景突出显示。您还可以指定行断点的条件。 | | 班级 | 当从另一个类引用该类时,并且在执行该类中带有断点的任何行之前,执行被挂起。 | | 例外 | 当异常发生时,执行被挂起。您可以指定是在捕获到异常、未捕获到异常时停止执行,还是两者都停止执行。 | | 方法 | 当调用方法时,执行被挂起。 | | 可变的 | 当变量被访问时,执行被挂起。您还可以配置断点,使其仅在变量被修改时暂停执行。 | | 线 | 每当线程启动或终止时,执行都被挂起。还可以在线程死亡时设置断点(或者在线程开始和死亡时都设置断点)。 |
线条

要设置行断点,如图 8-5 所示,点击要设置断点的行的左边距。或者,在编辑器中单击该行的任意位置,然后按 Ctrl+F8。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-5。

Line breakpoint

断点创建后,会自动注册到断点窗口(Alt+Shift+5),如图 8-6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-6。

Line breakpoint registered in the Breakpoints window

若要删除断点,请单击定义断点的行的左边距,或者单击该行并按 Ctrl+F8。通过反复单击 Ctrl+F8,可以在行断点和删除之间切换。还可以使用“断点”窗口删除断点。

要自定义行断点,请右键单击左边的红色图标,然后选择断点➤属性。或者,使用“断点”窗口(Alt+Shift+5)。在“断点”窗口中,右击断点并选择“属性”。断点属性窗口打开,如图 8-7 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-7。

Breakpoint Properties window

班级

你可以在一个类上设置一个断点,如图 8-8 所示,这样当类中的代码将要被访问时或者当类从内存中卸载时,调试器就会暂停。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-8。

Class breakpoint

若要设置类调用断点,请单击定义该类的行的左边距。或者,选择调试➤新断点(Ctrl+Shift+F8),从断点类型下拉列表中选择类,如图 8-9 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-9。

Class breakpoint type in the New Breakpoint window

断点窗口显示类调用断点,如图 8-10 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-10。

Class breakpoint registered in the Breakpoints window

方法

您可以设置一个断点,以便调试器在调用方法或构造函数时暂停,在方法或构造函数的任何行被执行之前,如图 8-11 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-11。

Method breakpoint

若要在方法或构造函数上设置断点,请单击定义该方法的行的左边距。或者,选择调试➤新断点(Ctrl+Shift+F8),并从断点类型下拉列表中选择方法。断点属性窗口打开,停止于下拉菜单设置为方法入口,如图 8-12 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-12。

Stop On Method Entry in the Breakpoint Properties window

通过选中给定类的所有方法复选框,可以使断点应用于该类中的所有方法和构造函数,这将导致断点窗口注册该类中的所有方法。断点窗口显示方法调用断点,如图 8-13 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-13。

All methods in class registered in the Breakpoints window

例外

您可以设置断点,以便调试器在程序中引发异常时暂停。要在异常上设置断点,请选择调试➤新断点(Ctrl+Shift+F8),然后从断点类型下拉列表中选择异常。新断点窗口打开,断点类型下拉框设置为异常,如图 8-14 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-14。

Exception breakpoint type in the New Breakpoint window

在“异常类名”字段中,键入要在其上设置断点的异常类。可以按 Ctrl+Space 让代码补全功能帮你补全类名,如图 8-14 所示。在“停止于”下拉列表中,选择是否希望断点应用于已捕获的异常、未捕获的异常或两者。

断点窗口显示异常断点,如图 8-15 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-15。

Exception breakpoint in the Breakpoints window

您可以设置断点,以便调试器在访问字段时暂停,或者仅在修改字段时暂停。要在字段上设置断点,选择调试➤新断点(Ctrl+Shift+F8),从断点类型下拉列表中选择字段,如图 8-16 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-16。

Field breakpoint in the New Breakpoint window

填写类名和字段名字段。从停止于下拉列表中选择一个选项。如果选择“字段访问”或“修改”,则每次在代码中访问该字段时,执行都会挂起。如果选择字段修改,则仅当字段被修改时,执行才会暂停。

如果您在按 Ctrl+Shift+F8 时选择了该变量,则新断点窗口的大多数字段都会为您正确填充。

断点窗口显示字段断点,如图 8-17 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-17。

Field breakpoint registered in the Breakpoints window

线

通过设置一个断点,在每次创建或结束新线程时暂停执行,可以监视程序中线程的创建或死亡。

要在线程上设置断点,选择调试➤新断点(Ctrl+Shift+F8),从断点类型下拉列表中选择线程,如图 8-18 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-18。

Thread breakpoint in the New Breakpoint window

在“停止于”下拉列表中,选择“线程开始”、“线程死亡”或“线程开始或死亡”。

断点窗口显示线程断点,如图 8-19 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-19。

Thread breakpoint registered in the Breakpoints window

管理断点

您可以使用如图 8-19 所示的断点窗口和之前的图在一个地方管理断点。您可以在断点上定义条件,并将断点分组,这对于测试指定的功能集非常有用。您还可以暂时禁用断点,并在此窗口中为断点提供其他自定义设置。

要打开“断点”窗口,请选择窗口➤调试➤断点或按 Alt+Shift+5。

情况

您可以设置一个断点,仅在满足特定条件时暂停执行。例如,如果您有一个很长的*For*循环,并且您想看看在循环结束之前发生了什么,那么您可以根据迭代器达到某个值来设置断点。

表 8-6 列出了您可以在断点上定义的条件示例。

表 8-6。

Example Breakpoint Conditions

| 工作 | 描述 | | --- | --- | | `i==4` | 如果变量`i`在当前范围内等于`4`,执行将仅在断点处停止。 | | `ObjectVariable!=null` | 执行不会在断点处停止,直到`ObjectVariable`被赋值。 | | `MethodName` | 如果`Method`具有布尔返回类型,只有当`Method`返回`true`时,执行才会在断点处停止。 | | `CollectionX.contains(ObjectX)` | 如果`ObjectX`在集合中,执行将仅在断点处停止。 |

若要使断点有条件,请打开“断点”窗口(Alt+Shift+5)。在“断点”窗口中,右键单击要在其上放置条件的断点,然后选择“属性”。

在“断点属性”窗口中,在“条件”字段中填入在断点处暂停执行所需满足的条件。

在某些情况下,您可能有几个相关的断点,您希望能够一起启用、禁用或删除它们。或者,您可能只想将一些断点合并到一个节点下,以使断点窗口不那么杂乱。

若要对断点进行分组,请通过选择窗口➤调试➤断点(Alt+Shift+5)来打开“断点”窗口。按住 Shift 键或 Ctrl 键单击以选择要分组的断点。右键单击选择,选择“设置组名”,然后输入组的名称。

在“断点”窗口中,断点分组在一个可展开的节点下。

允许

您可能会发现在整个应用中保持断点设置很有用,但是您可能不希望所有的断点都一直处于活动状态。如果是这种情况,您可以禁用断点或断点组,并保留它供以后使用。

若要禁用断点或断点组,请通过选择窗口➤调试➤断点(或按 Alt+Shift+5)打开“断点”窗口。在“断点”窗口中,右键单击断点或断点组,然后选择“禁用”。

若要删除一行断点,请单击有断点的行的左边距,或者单击该行并按 Ctrl+F8。若要删除另一种类型的断点,请通过选择“窗口”“➤调试”“➤断点”(或按 Alt+Shift+5)来打开“断点”窗口。在“断点”窗口中,右键单击断点,然后选择“删除”。

记录

如果您希望在遇到断点时进行监视,而不是每次遇到断点时都挂起执行,则可以将断点配置为不挂起执行。当程序在代码中到达这样的断点时,将在调试器控制台窗口中打印一条消息。

若要在命中断点时关闭执行挂起,请通过选择窗口➤调试➤断点(Alt+Shift+5)来打开“断点”窗口。在“断点”窗口中,右击断点并选择“属性”以打开“断点属性”窗口。在“操作”组合框中,选择“无线程(继续)”。

信息

您可以自定义在代码中遇到断点时打印到控制台的文本。

要自定义到达断点时打印的控制台消息,请通过选择窗口➤调试➤断点(Alt+Shift+5)打开“断点”窗口。在“断点”窗口中,右击断点并选择“属性”以打开“断点属性”窗口。在“打印文本”组合框中,修改要打印的文本。为了使打印文本更有意义,可以使用替代代码来打印螺纹名称和行号。

表 8-7 列出了替代代码。

表 8-7。

Example Messages and Substitution Codes

| 替代代码 | 印刷品 | | --- | --- | | `{className}` | 命中断点的类的名称。此代码不适用于线程断点。 | | `{lineNumber}` | 执行被挂起的行号。此代码不适用于线程断点。 | | `{methodName}` | 暂停执行的方法。此代码不适用于线程断点。 | | `{threadName}` | 命中断点的线程。 | | `{variableValue}` | 变量值(对于变量上设置的断点)或异常值(对于异常断点)。 | | `{variableType}` | 变量类型(针对变量上设置的断点)或异常类型(针对异常断点)。 |

手表

当您单步执行程序时,您可以监视字段和局部变量的运行值。

变量窗口(Alt+Shift+1)如图 8-20 所示,显示程序当前执行上下文中的所有变量,并列出它们的类型和值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-20。

Variables window

如果变量的值是一个对象引用,则该值由井号(#)和一个数字给出,该数字用作对象实例的标识符。

双击变量名称可以跳转到变量的源代码。

您还可以通过设置监视并在“监视”窗口(Alt+Shift+2)中查看,来创建与您的分析相关的变量和表达式的自定义视图,如图 8-21 所示,该窗口不同于变量窗口。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-21。

Watches window

“监视”窗口在三个方面不同于“变量”窗口。

  • “监视”窗口显示您指定的变量或表达式的值,这使窗口保持整洁。
  • “监视”窗口显示您设置的所有监视,无论变量是否在上下文中。如果变量分别存在于不同的上下文中,则“监视”窗口中给定的值适用于当前上下文中的值(不一定是设置监视的上下文)。
  • 监视在调试会话中持续存在。

在变量或字段上设置监视

要对变量或表达式设置监视,请在源代码编辑器中右键单击该变量,然后选择“新建监视”。然后,变量或表达式被添加到"监视"窗口中。

调试时,您还可以在当前调试上下文中检查变量的值,方法是将鼠标悬停在源代码编辑器中的变量上,以显示带有该值的工具提示,如图 8-22 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-22。

Tooltip showing value of current variable

监控分配给变量的对象

您可以创建一个所谓的“固定观察器”来监视分配给变量的对象,而不是变量本身的值。

要创建固定观察器,请启动调试会话并打开变量窗口(Alt+Shift+1)。在编辑器中,右键单击要为其设置固定监视的变量,然后选择“创建固定监视”。

然后,一个固定的监视被添加到“监视”窗口中。因为固定监视应用于调试会话期间创建的特定对象实例,所以当调试会话完成时,固定监视被移除。

显示类的 toString 方法的值

您可以在“局部变量”和“监视”窗口中添加一列,以显示对象的to String方法的结果。这样做提供了一种方法,可以获得比值列中的对象实例的数字标识符更有用的信息(如当前分配的字段的值)。

要在其中一个窗口中显示toString()列,请打开“局部变量”窗口(Alt+Shift+1)或“监视”窗口(Alt+Shift+2)。点按窗口右上角的按钮。在“更改可见列”对话框中,选择toString()复选框。

改变变量或表达式的值

调试程序时,可以更改“局部变量”或“监视”窗口中显示的变量或表达式的值。例如,您可以增加迭代器的值,以便更快地到达循环的末尾。

要更改变量值,请打开“监视”窗口或“变量”窗口。在变量或表达式的值字段中,键入新值,然后按 Enter 键。

显示以前方法调用的变量

调用栈窗口(Alt+Shift+3)显示当前方法调用链中的所有调用,如图 8-23 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-23。

Call Stack window

如果要查看链中另一个调用的变量状态,可以打开“调用栈”窗口,右键单击该方法的节点,然后选择“设为当前”。您也可以双击某个方法使其成为当前方法。

您可以使用“使被调用方成为当前方”( Ctrl+Alt+Up)和“使调用方成为当前方”( Ctrl+Alt+Down)命令浏览调用栈中的项目。

将不同的方法设为当前方法不会改变程序计数器的位置。如果用一个 step 命令或 continue 命令继续执行,程序将从暂停执行的地方继续执行。

线

IDE 的线程窗口(Alt+Shift+7)可以让你查看当前调试程序中线程的状态,如图 8-24 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-24。

The Threads window

它还使您能够更改在其他调试器窗口(如“调用栈”窗口和“变量”窗口)中监视的线程,并挂起单个线程。

切换当前监控的线程

“调用栈”和“变量”窗口的内容取决于调试器中当前正在监视的线程(也称为当前线程)。

若要切换当前监视的线程,请通过按 Alt+Shift+7 打开“线程”窗口。右键单击要监视的线程,然后选择“设为当前线程”。

挂起和恢复线程

您可以通过在“线程”窗口中右键单击线程节点并选择“挂起”来挂起线程的执行。

右键单击挂起线程的节点并选择“恢复”,可以恢复该线程的执行。

在断点处挂起单个线程

默认情况下,当程序遇到断点时,所有线程都被挂起。但是,您可以配置一个断点,以便在命中断点时只挂起其线程。通过按 Alt+Shift+5 打开“断点”窗口。在“断点”窗口中,右击断点并选择“属性”。在“断点属性”窗口中,从“挂起”组合框中选择“当前”。

将调试隔离到单个线程

默认情况下,应用中的所有线程都在调试器中执行。

如果希望隔离调试,以便调试器中只运行一个线程,请确保要调试的线程在“线程”窗口中被指定为当前线程(Alt+Shift+7)。当前线程标有图标。通过按 Alt+Shift+6 打开会话窗口。在“会话”窗口中,右键单击该会话的节点,然后选择“范围➤调试当前线程”。

识别死锁

IDE 可以通过在所有挂起的线程中自动搜索死锁来帮助您识别潜在的死锁情况。当检测到死锁时,IDE 会在调试窗口中显示一个通知,并识别涉及的线程,如图 8-25 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-25。

Detecting deadlocks

调试应用时,从主菜单中选择“调试➤检查死锁”,检查挂起的线程是否存在死锁。

代码更改

使用“应用代码更改”功能,可以在调试会话过程中微调代码,并在不启动新的调试会话的情况下继续调试。这可以为您节省大量时间,否则这些时间将花费在等待重新构建源代码和重新启动调试会话上。

应用代码更改功能对于表 8-8 中列出的一组特定场景非常有用。

表 8-8。

Scenarios for “Apply Code Changes”

| 方案 | 支持? | | --- | --- | | 微调您创建的可视组件的外观。 | 是 | | 改变方法中的逻辑。 | 是 | | 添加或移除方法或字段。 | 不 | | 更改类、字段或方法的访问修饰符。 | 不 | | 重构类层次结构。 | 不 | | 更改尚未加载到虚拟机中的代码。 | 不 |

有关更高级的代码更改功能,请参见 NetBeans 合作伙伴 ZeroTurnaround 在zeroturnaround.com提供的 JRebel 产品。JRebel 是一个 JVM 插件,它允许你重新加载你对代码所做的修改,而不需要重启/重新部署。它将您的项目工作区直接映射到一个正在运行的应用,因此当您对项目中的任何类或资源进行更改时,该更改会立即反映在应用中,从而跳过构建和重新部署阶段。您可以将 JRebel 与 NetBeans 调试器一起使用,并在重新加载代码更改时调试您的应用。

要在 IDE 中安装 JRebel,请转到plugins.netbeans.org,找到 JRebel NetBeans 插件,可以从以下网址下载: http://plugins.netbeans.org/plugin/22254/jrebel-netbeans-plugin 。此外,在 IDE 的大多数版本中,您应该能够在插件管理器中找到 JRebel NetBeans 插件,方法是在 IDE 中转到“工具”“➤插件”。

GUI 快照

如图 8-26 和 8-27 所示,GUI 快照是一个可视化调试工具,可以帮助您定位 GUI 组件的源代码。GUI 组件的源代码有时很难找到,快照为您提供了一种基于 GUI 找到代码的方法,而不是搜索代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-27。

GUI Snapshot for JavaFX components

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-26。

GUI Snapshot for Java Swing components

如本节所述,一旦创建了 GUI 的快照,就可以在快照中选择组件,并从弹出菜单中调用任务,以查看组件的源代码,显示侦听器,并在组件上设置断点。

要制作 GUI 快照,请在调试 Java Swing 或 JavaFX 应用时从主菜单中选择 Debug ➤ Take GUI Snapshot。当您选择获取 GUI 快照时,IDE 将获取 GUI 的快照,并在主窗口中打开该快照。

当您在快照中选择一个组件时,IDE 会在“属性”窗口中显示所选组件的详细信息。如果属性窗口不可见,可以从主菜单中选择窗口➤属性来打开该窗口。IDE 还会在“导航”窗口中显示组件在层次结构中的位置。右键单击快照中的组件,然后从弹出菜单中选择“转到组件声明”。IDE 将在编辑器中打开源文件,并将光标移动到代码中声明组件的那一行。再次右键单击快照中的组件,然后选择转到组件源。IDE 将在编辑器中打开源文件,并将光标移动到组件源代码中的行。

最后,您可以使用 GUI 快照和 Events 窗口来浏览组件事件,使您能够定位组件侦听器和由组件触发的事件。

九、分析和调整

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

NetBeans 中包含的内存分析器是唯一能够提供真实世代计数的分析器。这一特色本身的价值要比免费门票高出许多许多倍。一切正常,所以我在想代码,而不是 IDE。—Kirk Pepperdine,Java 性能专家

想象一下,经过几个月的开发时间和大量的测试,您的应用终于可以进行生产部署了。应用开始运行,最初几分钟一切似乎都很成功。突然,你接到一个用户的电话,告诉你他不能访问这个应用,因为它似乎无限期地加载。过了一会儿,你接到另一个电话,又一个。似乎您的应用不允许足够多的用户同时访问。

这是一个噩梦般的场景,在这个场景中,应用开发团队必须在极大的压力下做出关键的性能调优决策,并且他们必须直接对生产环境做出每一项更改。在这种情况下,你从哪里开始?会有什么问题呢?服务器配置是否妨碍了生产环境的足够连接,或者应用代码是否包含迫使用户等待的瓶颈?

许多应用直到投入生产后才进行性能调优。不幸的是,许多组织并不认为性能调优是他们开发生命周期的一个重要部分,而是把它作为出现问题时的一个分流步骤。更糟糕的是,Java 性能调优就像大海捞针一样。性能问题的原因可能在任何地方,从应用源代码到服务器配置。

在本章中,您将了解分析和调整过程,尤其是与内置 NetBeans IDE 分析器(如图 9-1 所示)和 Apache JMeter 相关的过程。您可以在主动分析和调优 Java 应用时使用这些过程,这样就可以避免在应用没有调优或调优不正确时可能出现的噩梦场景。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-1。

NetBeans Profiler

性能调整

性能调优应该是开发生命周期的一个标准部分。应用的设计应该以性能为中心。前瞻性地考虑性能意味着仔细考虑实现应用解决方案的所有方法,而不仅仅是最快的方法或最容易实现的方法。

特别是,在开发 Java EE 应用时很难考虑性能,尤其是因为 Java EE 环境中的几个争用点会给应用增加性能负担。Java EE 应用环境中遇到的主要性能问题往往与配置和环境问题有关。通常情况下,应用本身编码得很好,而应用部署到的应用服务器没有正确调优,或者配置不适合应用或预期的用户容量。

要针对生产应用进行适当调整,请按列出的顺序执行以下步骤:

Application tuning   Server tuning   Java runtime tuning   Server operating system and platform tuning

性能编码

在 Java 应用中,有许多编码情况可能会导致性能开销。特别是因为 Java EE 应用是并发执行的,所以它们会导致瓶颈。用户可能会争夺资源,如 web 服务和数据库。每个远程调用都会增加延迟,而序列化等过程会占用大量 CPU 资源,导致性能进一步下降。

考虑到这些问题,您需要仔细设计 Java EE 应用,确保使用正确的资源处理。应用的性能调优应该从其源代码开始。即使 Java EE 应用中性能问题的主要原因指向环境,正确的编码仍然可以在性能良好的应用中发挥关键作用。

除其他外,以下糟糕的编码实践可能会导致性能问题:

  • 过度序列化和反序列化
  • 终结器的过度使用
  • 太多的同步
  • 不丢弃未使用的变量
  • 太多动态变量
  • System.out.println的泛滥使用
  • 不再需要时不释放的会话
  • 无法关闭资源(例如,数据库和网络连接)

第六章,讨论了分析和重构,应该有助于识别你的代码中存在不良编码实践的区域,比如这里列出的。

执行代码审查对于减少抑制应用性能的问题是必不可少的。虽然粗制滥造的代码可能会逃过多个开发人员的眼睛,但检查它的眼睛越多越好。除了代码审查之外,应该有多个人对应用运行性能和负载测试,并将当前测试的结果与之前运行的结果进行比较。

调整环境

许多环境因素会影响应用的性能。您应该学习理解应用服务器的管理控制台和命令行实用程序,因为您将花费大量时间使用它们。例如,对于 GlassFish 4,默认域是为测试目的而适当配置的,而它很可能不适合生产环境,至少在没有进一步配置的情况下不适合。

确保为您的应用正确配置了部署设置。如果您的应用服务器允许自动部署或动态应用重载,请确保在生产环境中禁用这些设置,因为它们会对性能产生重大影响。还要注意日志的写入频率,因为频繁的日志记录会导致不合时宜的性能问题。考虑企业组件的应用服务器配置设置,例如企业 JavaBeans (EJB)容器、Java 消息服务(JMS)和 Java 事务服务(JTS)。始终检查默认配置设置,并修改它们以支持生产环境。适当时,配置服务器群集以通过负载平衡提供高可用性。

请记住,不要将数据库视为数据的黑匣子。无论是查询大型数据集还是执行太多小型查询,数据库访问都可能成为应用的争用点。无论是哪种情况,都要有一个数据库管理员(DBA)的联系电话,他可能能够在数据库表上创建索引,或者甚至在有意义的时候将应用逻辑合并到数据库中。

容量规划

许多工具可以帮助您为产品发布准备应用。分析工具在应用的开发生命周期中扮演着重要的角色。此类工具可用于预测应用在正常或重负载下发布到生产环境后的性能。

在 NetBeans IDE 环境中,两个这样的工具是内置的 NetBeans Profiler(以下称为“Profiler”)和 Apache JMeter 插件。这两个特性都有助于您在将应用部署到生产环境之前检测有关应用的重要运行时信息,使您能够监控与线程状态、CPU 性能、内存使用和锁争用相关的数据。

评测器入门

该分析器内置于 NetBeans IDE 中。不需要单独的安装或启用过程。

通过使用探查器,您可以在 IDE 中对项目或文件执行一组特定的分析任务。探查器执行的分析任务如下:

  • 遥测:应用监控,带有 CPU 和内存使用情况的图表
  • 方法:分析方法执行和时间,也称为 CPU 分析
  • 对象:分析对象分配和大小,也称为内存分析
  • 线程:在时间轴中监视和可视化线程状态
  • 锁:锁争用的分析和可视化

图 9-2 显示了 NetBeans IDE 8.1 中新增的配置和启动分析窗口。它列出了前面讨论过的分析任务,并为您提供了开始使用这些任务的简单方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-2。

Configure and Start Profiling window

在接下来的小节中,您将依次了解每一项性能分析任务。

基本分析术语

在继续之前,让我们快速浏览一下使用 profiler 时需要熟悉的一些术语。虽然 NetBeans Profiler 使您可以轻松地分析应用,即使您以前从未使用过分析工具,但它确实有助于理解所有分析工具通用的基本术语。

  • 侧写员。一个向您展示应用在 Java 虚拟机(JVM)中运行时的行为的工具。
  • 仪器仪表。将分析方法(计数器、计时器等)插入到应用的 Java 字节码中。这些方法不会改变程序的逻辑,并且会在分析停止时被移除。
  • 剖析开销。执行分析方法而不是应用代码所花费的时间。
  • 堆。JVM 为 new 操作符在程序中分配的所有对象使用的内存池。
  • 垃圾收集。从内存中移除应用不再使用的对象。JVM 定期执行垃圾收集。
  • 内存泄漏。您的应用不再使用的对象,但由于有一个或多个对它的无意引用,它不能被 JVM 垃圾收集。
  • 自我时间。执行一个方法中的指令所需的时间。这不包括该方法调用的任何其他方法所花费的时间。
  • 热点。一种自身时间相对较长的方法。
  • 分析根目录。为性能分析选择的类或方法。
  • 呼叫树。从分析根可到达的所有方法。

遥感勘测

遥测任务有助于在应用运行时监控高级统计数据。遥测任务不执行检测,因此启动速度很快,因为它没有强加分析开销。

要使用遥测任务,请右键单击某个应用,然后选择配置文件。在“配置和启动性能分析”窗口中,单击“配置会话”按钮,然后选择“遥测”。单击个人资料。或者,您可以通过主菜单栏中的“配置文件➤附加”菜单项附加到已经运行的进程。分析会话开始。

遥测窗口打开,如图 9-3 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-3。

Telemetry window

遥测任务显示应用的基本信息:

  • 分配的堆内存
  • 正在使用的堆内存
  • 花费在垃圾收集上的时间百分比
  • 正在运行的线程和类的数量

遥测窗口还显示堆上幸存的代。有关幸存代的说明,请参考下面的“了解幸存代”一节。

了解幸存的几代

为了理解幸存的几代,考虑一下 JVM 的垃圾收集过程。每次垃圾收集器运行时,每个对象要么存活下来并继续占用堆内存,要么被移除并释放其内存。如果一个对象存活下来,它的年龄增加 1。换句话说,对象的年龄就是它存活下来的垃圾收集次数。幸存代的值是不同对象的年龄数。

例如,假设有几个对象在应用启动时都被分配了。此外,还有另一组对象是在应用运行的中点分配的。最后,有一些对象刚刚被分配,只经历了一次垃圾收集。如果垃圾收集器已经运行了 80 次,那么第一组中的所有对象的年龄都将是 80;第二组中的所有对象将具有 40 岁的年龄;第三组中的所有对象的年龄都是 1。在这个例子中,存活代的值是 3,因为堆上的所有对象有三个不同的年龄:80、40 和 1。

在大多数 Java 应用中,幸存代的值最终会稳定下来。这是因为应用已经到达了一个所有长期对象都已被分配的点。预期寿命较短的对象不会影响幸存代计数,因为它们最终会被垃圾回收。

如果应用的存活代数值随着应用的运行而不断增加,这可能表明存在内存泄漏。换句话说,随着时间的推移,您的应用将继续分配对象,每个对象都有不同的年龄,因为它经历了不同次数的垃圾收集。如果对象被正确地垃圾收集,不同对象年龄的数量将不会增加。

方法

当您想要获得有关应用中哪些方法使用最多 CPU 时间的详细信息时,请使用 Methods 任务。通过方法任务,您正在分析应用的性能。Methods 任务还会告诉您每个方法被调用了多少次。

您可以分析整个应用的方法性能,也可以只分析部分方法的性能。对于方法任务,所有类和项目类模式使用开销非常低的采样,因此它们是大型应用初始性能分析的理想选择。(对象任务也是如此。)选择分析整个应用意味着所有被调用的方法都将被检测。大量的检测会显著降低性能,因此该选项最好用于较小的应用。另一个因素是,对整个应用进行分析会产生大量的分析信息,您必须解释这些信息。你需要解释的越多,某些东西被误解的可能性就越大。

如果您怀疑应用的某些部分导致了性能问题,那么只分析这些部分可能是最好的方法。如果选择只分析应用的一部分,则必须选择一个或多个分析根。

查看实时结果

要使用“方法”任务,请右键单击应用,然后选择“配置文件”。在“配置和启动性能分析”窗口中,单击“配置会话”按钮,然后选择“方法”。单击个人资料。或者,您可以通过主菜单栏中的“配置文件➤附加”菜单项附加到已经运行的进程。分析会话开始。

方法窗口打开,如图 9-4 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-4。

Methods window

该窗口显示至少调用过一次的所有方法。默认的排序顺序是按自己的时间降序排列。应用中使用时间最多的方法显示在列表的顶部。所用时间显示在两列中,一列用图形显示每种方法所用时间的百分比,另一列用文本显示原始时间值和百分比。调用次数也显示在 Hits 列中。随着应用的运行,探查器将更新这些值。

要更改排序顺序,请单击列标题。这将使用列中的值对表进行降序排序。再次单击以升序排序。单击工具栏中的 Hot Spots 按钮,该列将按照包、类和方法名对表进行排序。

要更快地找到特定方法,请在窗口中右键单击,然后选择筛选或查找。输入方法名称,然后按 Enter 键。该窗口显示符合您的标准的项目。

拍摄结果快照

要查看更详细的信息,请选择配置文件➤获取收集结果的快照(Alt+F2)。将显示 CPU 快照窗口,快照的时间作为其标题。

CPU 快照窗口打开,如图 9-5 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-5。

CPU Snapshot window

“CPU 快照”窗口显示按线程组织的调用树。要切换到热点视图,请点按工具栏中的“热点”按钮。

当您单击选项卡右上角的信息图标时,您将看到一个窗口,显示快照信息的摘要:日期、时间、过滤器设置等。快照窗口顶部的图标允许您保存快照、控制快照的粒度(方法、类或包)以及搜索快照。

目标

使用 Objects 任务跟踪应用使用的堆内存。如果 JVM 在运行您的应用时报告了一个OutOfMemoryError,分析器可以帮助您确定问题的原因。

查看实时结果

要使用对象任务,请右键单击应用,然后选择配置文件。在“配置和启动性能分析”窗口中,单击“配置会话”按钮,然后选择“对象”。单击个人资料。或者,您可以通过主菜单栏中的“配置文件➤附加”菜单项附加到已经运行的进程。分析会话开始。

对象窗口打开,如图 9-6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-6。

Objects window

显示的列如下:

  • 分配的对象。探查器正在跟踪的对象数。默认情况下,这个数字大约是应用实际分配的对象的 10%。使用 Profiler 工具栏中的“限制分配深度”复选框来更改默认值。通过只监视所创建对象的一个子集,分析器可以极大地减少 JVM 上的开销,从而使应用以接近全速的速度运行。
  • 活的物体。当前在堆上并因此占用内存的已分配对象的数量。
  • 活字节。活动对象使用的堆内存量。
  • 平均值。年龄。活体的平均年龄。每个对象的年龄是它存活下来的垃圾收集次数。年龄的总和除以活动对象的数量就是平均值。年龄。
  • 使用活体计算的世代。一个对象的年龄是它经历的垃圾收集的次数。世代值是活动对象不同年龄的数量。有关幸存代的详细信息,请参见本主题前面的部分。

要更改排序顺序,请单击列标题。这将使用列中的值对表进行降序排序。再次单击以升序排序。按代对表进行排序通常有助于识别导致内存泄漏的类。这是因为世代值的增加通常表示内存泄漏。

拍摄结果快照

为了查看应用中的哪些方法正在分配对象,您必须拍摄快照。您还可以相互比较快照,以确定差异和其他感兴趣的方面。

使用配置文件➤获取收集结果的快照(Alt+F2)。将显示 CPU 快照窗口,快照的时间作为其标题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-7。

CPU Snaphot window

线

Threads 任务对于在应用运行时监视每个线程的状态非常有用。

要监视线程,请右键单击某个应用,然后选择“配置文件”。在“配置并启动性能分析”窗口中,单击“配置会话”按钮,然后选择“线程”。单击个人资料。或者,您可以通过主菜单栏中的“配置文件➤附加”菜单项附加到已经运行的进程。分析会话开始。

螺纹窗口如图 9-8 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-8。

The Threads window

螺纹以下列颜色编码显示:

  • 绿色。线程正在运行或准备运行。
  • 紫色。线程正在Thread.sleep()中休眠。
  • 黄色。线程正在等待对Object.wait()的调用。
  • 红色。尝试进入同步方法或块时,线程被阻止。

您可以使用显示颜色的列下方的滚动条来滚动时间,并检查从应用启动时开始的线程状态。点按工具栏中的“放大”和“缩小”按钮,以控制“线程”窗口中显示的细节级别。

锁定争用

当一个线程试图获取一个锁,而另一个线程持有它,迫使它等待时,就会发生锁争用。

锁争用会扼杀您通过并行使用多个内核可能获得的任何性能提升,因为您是通过使用锁来按顺序组织工作的。在最坏的情况下,只有一个线程会运行。

“锁争用”窗口显示关于锁争用的详细信息。它显示了对性能瓶颈的分析,这可以帮助您确定负责的线程。

要识别锁争用,请右键单击某个应用,然后选择“配置文件”。在“配置和启动性能分析”窗口中,单击“配置会话”按钮,然后选择“锁定争用”。单击个人资料。或者,您可以通过主菜单栏中的“配置文件➤附加”菜单项附加到已经运行的进程。分析会话开始。

锁竞争窗口如图 9-9 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-9。

Lock Contention window

图 9-9 中显示的锁争用分析适用于 Java 教程 docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html 中在此 URL 讨论的死锁示例。

将探查器附加到外部进程

NetBeans Profiler 可以分析不是由 IDE 启动的应用。换句话说,它可以附加到一个 JVM 上。要使用此功能,请选择“配置文件➤附加到外部进程”,然后在“配置文件外部进程”中单击“附加”。附加设置窗口打开,如图 9-10 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-10。

The Attach Settings window

“附加设置”窗口允许您选择正在运行的应用进行性能分析。或者,您可以在本地或远程将分析器附加到手动启动的 Java 进程。

Apache JMeter 入门

Java EE 应用环境中最成问题的性能问题之一是用户容量。多少用户可以同时访问应用?在开发环境中,这个问题是不可能回答的,因为有太多的变量在起作用。即使开发环境的配置方式与生产环境完全相同,生产环境和开发环境之间也几乎总是会出现不一致。通常情况下,用户能力测试会变成一场碰运气的游戏。

Apache JMeter 工具( jmeter。阿帕奇。org )在这种情况下会有所帮助。Apache JMeter 是一个测量性能和负载测试的 Java 应用。IDE 可以很好地与 Apache JMeter 集成,一旦安装了 Apache JMeter 插件,就不需要安装 Apache JMeter,也不需要手动打开它。

要在 IDE 中开始使用 Apache JMeter,进入工具➤插件并安装插件,如图 9-11 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-11。

Installingthe Apache JMeter plugin

使用 Apache JMeter

一旦在 IDE 中安装了 Apache JMeter 插件,使用新的文件窗口(Ctrl+N)来创建 JMeter 计划,如图 9-12 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-12。

JMeter Plan in the New File window

要将 JMeter 测试作为构建的一部分来运行,您可以使用这里显示的 XML 条目在 POM 中注册 Maven JMeter 插件( jmeter.lazerycode.com )。

<build>

<plugins>

<plugin>

<groupId>com.lazerycode.jmeter</groupId>

<artifactId>jmeter-maven-plugin</artifactId>

<version>1.10.1</version>

<executions>

<execution>

<id>jmeter-tests</id>

<phase>verify</phase>

<goals>

<goal>jmeter</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</buil d>

请注意,Maven JMeter 插件希望您的 JMeter 计划位于src/test/jmeter文件夹中。在 IDE 中,你可以右击 JMeter 计划来运行它们或者打开 Apache JMeter 进行编辑,如图 9-13 所示。当您为 Apache JMeter 安装 NetBeans 插件时,会自动安装 Apache JMeter。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9-13。

Menu items for editing and running JMeter plans

您可以在不启动 Apache JMeter 的情况下执行 JMeter 计划的基本编辑。只需点击属性,这是列表中的最后一个菜单项,如图 9-13 所示。这将打开一个属性窗口,您可以在其中更改基本设置,如用户数量和目标服务器。

十、版本控制

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

像 Git 这样的版本控制系统看起来像编程语言一样复杂。将 Git 集成到 NetBeans 中降低了复杂性,因此程序员和我的学生可以完成这项工作。—Ken Fogel,加拿大道森学院计算机科学技术系主任

使用版本控制系统(VCS)来共享您的项目并整合来自多个开发人员的贡献是在团队开发环境中工作的最重要的部分之一。在 NetBeans IDE 中,版本控制功能已集成到您的日常工作流程中,因此您不必一直切换到命令行或外部工具来执行更新和提交本地更改。

您可以选择仅共享您的源代码,或者共享您正在使用的完整 NetBeans 项目。当您将 NetBeans 项目(即 NetBeans 元数据)签入存储库时,在 IDE 中处理该项目的其他开发人员就不必自己设置项目了。他们只需检查项目并立即开始工作。

IDE 中的版本控制支持提供了:

  • IDE 中版本状态的显示。
  • 能够在 IDE 中对文件运行版本控制命令。
  • 帮助您将变更签入到存储库中并在分支之间进行合并的工具。
  • 用于搜索文件版本历史和查看文件修订之间差异的高级工具。

IDE 为 Git ( git-scm.com )提供了最全面的支持,Git 是目前最流行、最广泛使用的版本控制系统。它对 Mercurial 和 Subversion 的支持与其对 Git 的支持不相上下,而 CVS、ClearCase 和 Perforce 都有插件。本章的重点是 Git,但是如果您使用的是 Mercurial、Subversion、CVS、ClearCase 或 Perforce,在大多数情况下这里描述的命令和设置是相似的。

Git 是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型的项目。每一个 Git 克隆都是一个成熟的存储库,具有完整的历史和完整的版本跟踪功能,不依赖于网络访问或中央服务器。分支和合并既快速又容易,Git 用于文件以及文件夹和文件组的版本控制,例如 NetBeans 项目。

在 IDE 中设置 Git

使用 Git 中的文件不需要任何设置。不需要安装额外的插件,尽管 Git 工具栏插件在提供对常用 Git 操作的访问时非常有用: plugins.netbeans.org/plugin/51604/git-toolbar

每当您访问 Git 存储库中的文件时,IDE 都会为文件提供完整的 Git 命令和状态显示。您可以通过右键单击项目并选择 Git 来判断目录或项目是否在 Git 工作目录中。Git 存储库中的项目还会在项目名称旁边显示一个蓝色的存储库图标。

IDE 可以帮助您完成使用 Git 库的每一步。然而,假设您已经在某个地方创建了一个实际的 Git 存储库,比如在 GitHub ( github.com )。一旦您创建了一个 Git 存储库——在 GitHub 等互联网上或本地——您就可以按照下面的说明开始了。

初始化 Git 存储库

要从不在源代码控制中的现有文件初始化 Git 存储库,您需要转到“项目”窗口,选择一个未版本化的项目,并右键单击项目名称。在右键弹出菜单中选择版本控制➤初始化 Git 库,如图 10-1 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-1。

Initializing a Git repository

或者,在主菜单中,选择团队➤ Git ➤初始化。

指定要存储版本化文件的存储库的路径。您可以使用“初始化 Git 存储库”窗口或单击“浏览”,然后浏览所需的目录来完成此操作。

在您指定的文件夹中会创建一个.git子文件夹,默认情况下,该文件夹是您的 NetBeans 项目文件夹。这是您的本地 Git 存储库,其中存储了您的项目快照的所有数据。Git 开始对您指定的文件夹中的所有文件进行版本控制。您可以打开➤输出➤输出窗口,查看 IDE 在您本地工作目录下创建库的进度报告,如图 10-2 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-2。

Output window showing initialization process

所有项目文件都被标记为已添加到您的工作树中。要查看文件的状态,请将光标放在“项目”窗口中的文件名上。在工具提示中,工作树中文件的状态以绿色显示在斜杠的右侧,如图 10-3 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-3。

Versioning status in tooltip

在初始化 Git 存储库之后,您可以添加文件或者直接将它们提交给 Git 存储库。

克隆 Git 存储库

要获得一个已经存在的 Git 存储库的副本,比如在 GitHub 上,您需要“克隆”它。在执行帮助您在 IDE 中完成克隆存储库向导的后续步骤之前,请确保您知道 Git 存储库的 URL。

此外,在执行下一步操作时,请确保没有在 IDE 中打开版本控制项目,因为 IDE 是上下文相关的,如果当前选择了版本控制项目,IDE 将假定您要对该项目执行版本控制任务。因此,如果在“项目”窗口中未选择任何版本化项目,请从主菜单中选择“➤团队 Git ➤克隆”。克隆存储库向导打开,如图 10-4 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-4。

Clone Repository wizard

在存储库步骤中,指定 Git 存储库位置的路径、用户名和密码(如果需要,可以保存它们以备将来使用)。或者,单击代理配置以显示选项窗口并设置代理服务器设置。完成后,点按“好”。单击“下一步”转到向导的下一步。

在“远程分支”页面中,选择要提取(下载)到本地存储库的存储库分支。单击下一步。

在“目标目录”页面中,指定以下内容:

  • 在“父目录”字段中,指定硬盘上用于克隆存储库的目录的路径(或者,单击“浏览”按钮并导航到该目录)。“父目录”字段中填充了默认NetBeansProjects目录的路径,所有 NetBeans 项目都存储在该目录中。
  • 在“克隆名称”字段中,指定将在其中克隆原始项目的本地文件夹的名称。默认情况下,克隆名称由 Git 存储库名称填充。
  • 在“检出分支”字段中,选择要检出到工作树中的分支。
  • 在“远程名称”字段中,表示要克隆的原始存储库的名称。origin是正在克隆的存储库的默认别名。这是推荐值。
  • 保持选中“克隆后扫描 NetBeans 项目”复选框,以便在克隆完成后立即激活后扫描。这将允许在克隆的资源中搜索 NetBeans 项目,IDE 将提供打开找到的项目。

单击完成。在 Git 存储库被克隆之后,元数据.git文件夹被创建在您在向导中选择的文件夹中。

向 Git 存储库添加文件

要开始跟踪一个新文件,并将更改转移到 Git 存储库中已经跟踪的文件,您需要将它添加到 Git 存储库中。当向 Git 存储库添加文件时,IDE 首先在索引中合成并保存项目的快照。执行提交后,IDE 会将这些快照保存在本地 Git 存储库中的文件头中。

IDE 允许您在两个工作流之间进行选择,如下所述。

  • 向索引中显式添加新的或修改过的文件,然后只将那些存放在索引中的文件提交到文件头。为此,请打开“项目”窗口,右键单击要添加的文件。在上下文菜单中,选择 Git ➤添加。这将在提交文件之前将文件内容添加到索引中。在“项目”窗口中,右键单击要提交的文件。在提交窗口中,选择头和索引之间的变化切换按钮。这将显示已经转移的文件列表。提交文件,如下面的“将源代码提交到存储库”一节所述。
  • 跳过向索引添加新的或修改过的文件,将所需的文件直接提交到文件头。要开始这样做,请打开“项目”窗口,右键单击要提交的文件。在上下文菜单中,选择 Git ➤提交。在提交窗口中,选择选择索引和工作树之间的更改切换按钮。这将显示未转移的文件列表。提交文件,如下面的“将源代码提交到存储库”一节所述。

文件在文件头中的状态以绿色显示在斜线的左侧,如本章前面的图 10-3 所示。

如果在文件夹上调用该操作,并且遵循 NetBeans IDE 平面文件夹内容结构,则该操作将以递归方式工作。

编辑文件

一旦在 IDE 中打开了 Git 版本的项目,就可以开始对源代码进行更改了。与在 NetBeans IDE 中打开的任何项目一样,当文件出现在 IDE 的窗口中时,可以通过双击其节点在源代码编辑器中打开文件,例如,“项目”(Ctrl+1)、“文件”(Ctrl+2)和“收藏夹”(Ctrl+3)窗口。

在 IDE 中处理源文件时,您可以使用各种 UI 组件来帮助查看和操作版本控制命令。现在我们将探讨这些方面——在源代码编辑器中查看更改、查看文件状态信息、比较文件修订以及恢复更改。

在源代码编辑器中查看更改

当您在 IDE 的源代码编辑器中打开受版本控制的文件时,您可以查看根据 Git 存储库中的基本版本修改文件时发生的实时更改。工作时,IDE 会在源代码编辑器的边距中使用颜色编码来传达以下信息:

  • 蓝色:表示自早期版本以来已更改的行。
  • 绿色:表示自早期版本以来添加的行。
  • 红色:表示自早期版本以来已删除的行。

源代码编辑器的左边显示了逐行发生的更改。当你修改一个给定的行时,修改会立即显示在左边的空白处,如图 10-5 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-5。

Left margin shows changes

您可以单击空白处的颜色分组,以使版本控制命令可用。例如,在图 10-6 中,当点击蓝色图标时,您会看到可用的版本控制按钮,这表示行已经从您的本地副本被更改。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-6。

Versioning commands for a color grouping

源代码编辑器的右边为您提供了一个概览,从上到下显示了对文件所做的整体更改,如图 10-7 所示。当您对文件进行更改时,会立即生成颜色编码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-7。

Right margin shows overview

您可以单击页边距中的特定点,将行内光标立即带到文件中的该位置。要查看受影响的行数,请将鼠标悬停在右边的彩色图标上。

查看文件状态信息

当您在“项目”( Ctrl+1)、“文件”( Ctrl+2)、“收藏夹”( Ctrl+3)或“版本控制”视图中工作时,IDE 提供了多种可视化功能来帮助您查看文件的状态信息。在图 10-8 中,请注意徽章(即扩展包上的蓝色图标徽章)和文件名的颜色是如何重合的,这为您提供了一种简单而有效的方法来跟踪文件的版本信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-8。

Viewing file status information

再次在图 10-8 中,注意已添加或更改的文件名后的灰色草书文本。这些标签称为“文件状态标签”,如果您从主菜单中选择“查看➤”“显示版本控制标签”,它们将显示在添加或更改的文件旁边。

徽章、颜色编码、文件状态标签,以及最重要的 Git Diff Viewer,这些都有助于您在 IDE 中有效地查看和管理版本信息。

徽章和颜色编码

徽章应用于项目、文件夹和包节点,并通知您该节点中包含的文件的状态。

下面的列表显示了用于徽章的配色方案。

  • 蓝色标记:表示工作树中存在已被修改、添加或删除的文件。对于包,这个标记只适用于包本身,而不适用于它的子包。对于项目或文件夹,徽章表示该项目或任何包含的子文件夹中的更改。
  • 红色标记:标记包含冲突文件的项目、文件夹或包。对于包,这个标记只适用于包本身,而不适用于它的子包。对于项目或文件夹,该标记指示该项目或任何包含的子文件夹中的冲突。对文件名进行颜色编码,以表明它们在存储库中的当前状态。
  • 黑色:表示文件没有更改。
  • 蓝色:表示文件已被本地修改。
  • 绿色:表示文件已在本地添加。
  • 红色:表示文件存在合并冲突。
  • 灰色:表示文件被 Git 忽略,不会包含在版本控制命令中(例如,更新和提交)。如果文件有版本,则不能忽略它们。
文件状态标签

IDE 可以通过“文件状态标签”显示文件的两个状态值。通过从主菜单中选择查看➤显示版本控制标签,可以打开和关闭文件状态标签。

这些是 IDE 提供的文件状态标签:

  • 描述文件的工作树和索引状态之间差异的状态。
  • 描述文件索引状态和当前头提交之间差异的状态。

文件状态标签提供了 ide 窗口中版本化文件状态的文本指示:

  • 答:已添加
  • u:已更新但未合并
  • 男:修改
  • d:删除
  • I:忽略
  • r:已重命名

IDE 在文件右侧以灰色文本显示状态(新建、修改、忽略等)和文件夹信息,如图 10-9 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-9。

File status labels

合并冲突中的文件具有未合并状态,通常用红色标注,直到文件未被您的显式操作解决。未合并文件的状态标签取决于方案(例如,A/A 未合并,两者均已添加)。

Git 版本视图

Git Versioning 视图为您提供了对本地工作树的选定文件夹中的文件所做的所有更改的实时列表。默认情况下,它在 IDE 的底部面板中打开,列出添加、删除或修改的文件。

要打开“版本控制”视图,请选择一个版本控制文件或文件夹(例如从“项目”、“文件”或“收藏夹”窗口中),然后从右键菜单中选择“➤显示更改”或从主菜单中选择“➤团队显示更改”。图 10-10 所示的窗口出现在 IDE 的底部。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-10。

Git Versioning view

默认情况下,版本控制视图显示工作树中所选包或文件夹内所有已修改文件的列表。使用工具栏中的按钮,您可以选择显示索引和文件头之间、工作树和索引之间或工作树和文件头之间有差异的文件列表。您也可以单击所列文件上方的列标题,按名称、状态或位置对文件进行排序。

版本控制视图工具栏还包括一些按钮,使您能够对列表中显示的所有文件调用最常见的 Git 任务。您可以在 Versioning 视图中访问其他 Git 命令,方法是选择一个对应于已修改文件的表格行,然后从右键菜单中选择一个命令。

比较文件修订

使用版本化项目时,比较文件版本是一项常见任务。IDE 允许您使用 Diff 命令来比较修订。IDE 中提供了几种比较模式——比较到磁头、比较到跟踪和比较到。

选择受版本控制的文件或文件夹(例如从“项目”、“文件”或“收藏夹”窗口中)。从主菜单中选择➤队➤队队长。在 IDE 的主窗口中,会为所选文件和修订打开一个图形化的比较查看器,如图 10-11 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-11。

Diff window

比较查看器在并排的面板中显示两个副本。更新的副本出现在右侧,因此如果您将存储库修订与您的工作树进行比较,工作树会显示在右侧面板中。比较查看器使用与其他地方相同的颜色编码来显示版本控制更改。在图 10-11 中,绿色块表示已经添加到最新版本中的内容。红色块表示早期版本中的内容已从较新版本中删除。蓝色表示突出显示的行中发生了变化。其他修订可以从比较查看器工具栏下面的比较和来源下拉列表中选择。

比较查看器工具栏还包括一些按钮,使您能够对列表中显示的所有文件调用最常见的 Git 任务。

如果在工作树中对本地副本执行比较,IDE 允许您直接从比较查看器中进行更改。为此,您可以将光标放在比较查看器的右窗格中,并相应地修改您的文件,也可以使用显示在每个突出显示的更改旁边的内嵌图标。当您在右侧滚动时,左侧编辑器将滚动,以便您可以看到在比较中所做的更改。

还原更改

要丢弃对工作树中选定文件所做的本地更改,并用索引或文件头中的文件替换它们,请选择一个版本化文件或文件夹(例如从“项目”、“文件”或“收藏夹”窗口中)。从主菜单中选择团队➤恢复修改。恢复修改窗口打开,如图 10-12 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-12。

Reverting changes

指定附加选项(如仅将索引中未提交的更改还原到 HEAD)。单击还原。

IDE 会用您指定的文件替换选定的文件。

将源代码提交给存储库

要将文件提交到 Git 存储库,请在“项目”窗口中,右键单击要提交的文件。在上下文菜单中,选择 Git ➤提交。提交窗口打开,如图 10-13 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-13。

Commit window

提交窗口包含以下字段:

  • 提交消息:用于描述正在提交的更改的文本区域。
  • 作者和提交者:下拉列表,让您区分谁进行了更改和谁实际提交了文件。
  • 要提交的文件:列出所有修改过的文件、所有已经从工作树中删除的文件(本地)、所有新文件(Git 存储库中尚不存在的文件)以及所有已经重命名的文件。这里有两个切换按钮,用于切换实际提交的执行模式。头和索引之间的变化显示转移的文件列表。标题和工作树之间的更改显示已暂存或已修改/创建但尚未暂存的文件列表。要在此指定是否从提交中排除单个文件,请取消选中第一列“提交”中的复选框,或者右键单击“提交操作”列中的文件行,然后从弹出菜单中选择“从提交中排除”。要在此显示比较查看器,请右键单击“提交操作”列中的文件行,然后从弹出菜单中选择“比较”。
  • 更新问题:用于跟踪与提交的变更相关的问题的部分。您需要安装 JIRA 或 Subversion 插件来开始在 IDE 中跟踪问题。

在提交消息文本区域中键入提交消息。或者,您可以执行以下操作:

  • 单击位于右上角的“最近的消息”图标,查看并选择您以前使用过的消息列表。
  • 单击位于右上角的加载模板图标,选择一个消息模板。

为单个文件指定操作后,单击提交。

IDE 将执行提交,并将您的快照存储到存储库中。IDE 的状态栏位于界面的右下角,在提交操作发生时显示。成功提交后,“项目”、“文件”和“收藏夹”窗口中的版本标记消失,已提交文件的颜色代码恢复为黑色。

使用分支

IDE 的 Git 支持使您能够通过使用分支来维护整个代码库的不同版本。

在 IDE 中处理分支时,可以创建、签出、合并和删除分支。在接下来的几节中,我们将研究每一个 Git 术语,并学习如何在 IDE 中执行这些操作。

创造

要创建本地分支,如果出于稳定或试验的目的,您想在不干扰主干的情况下使用文件系统的单独版本,请在“项目”或“文件”窗口中,从要在其中创建分支的存储库中选择一个项目或文件夹。

在主菜单中,选择团队➤分支/标签➤创建分支。另一种方法是,右键单击受版本控制的项目或文件夹,然后在弹出菜单中选择“Git ➤分支/Tag ➤创建分支”。创建分支窗口打开,如图 10-14 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-14。

Create Branch window

在分支名称字段中,输入正在创建的分支的名称。通过在“修订”字段中输入提交 ID、现有分支或标记名称,键入选定项目的特定修订,或者单击“选择”查看存储库中维护的修订列表。或者,在“选择版本”窗口中,展开分支并选择所需的分支,在相邻的列表中指定提交 ID,然后单击选择。查看特定于分支版本的提交 ID、作者和消息字段,然后单击创建。

该分支被添加到 Git 资源库的 Branches/Local 文件夹中,可以在 Git 资源库浏览器中看到,如图 10-15 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-15。

Git Repository Browser

您可以通过右键单击 Git 版本化项目并选择 Git ➤存储库➤浏览器来打开 Git 存储库浏览器。

退房

如果您需要编辑已经存在的分支上的文件,您可以检出该分支,将文件复制到您的工作树中。要签出修订,请从主菜单中选择团队➤签出➤签出修订。“签出所选版本”窗口打开,如图 10-16 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-16。

Checkout Selected Revision window

通过在“修订”字段中输入提交 ID、现有分支或标记名来指定所需的修订,或者单击“选择”来查看存储库中维护的修订列表。如果在上一步中没有单击选择,请跳过。在“选择修订”窗口中,展开分支并选择所需的分支,如果需要,在相邻的列表中指定提交 ID,然后单击选择。如果指定的修订引用了一个没有用分支名称标记的有效提交,那么您的头将被分离,并且您不再位于任何分支上。查看特定于所签出版本的提交 ID、作者和消息字段。要从已签出的版本创建新分支,请选择“签出为新分支”选项,并在“分支名称”字段中输入名称。单击“检出”以检出修订。

工作树和索引中的文件被更新以匹配指定修订中的版本。

合并

要将修改从存储库版本移植到工作树,请从主菜单中选择团队➤分支/标签➤合并版本。合并修订窗口打开,如图 10-17 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-17。

Merge Revision window

通过在“修订”字段中输入提交 ID、现有分支或标记名来指定所需的修订,或者单击“选择”来查看存储库中维护的修订列表。

如果在上一步中没有单击选择,请跳过此步骤。在“选择修订”窗口中,展开分支并选择所需的分支,如果需要,在相邻的列表中指定提交 ID,然后单击选择。单击合并。完成当前分支、工作树内容和指定分支之间的三向合并。如果发生合并冲突,冲突文件会用红色标记来表示。合并后,您仍然必须提交更改,以便将它们添加到头中。

如果自从创建特征分支以来主分支已经分叉,则将特征分支合并到主分支将创建合并提交。这是典型的合并。如果主节点没有分叉,Git 不会创建新的提交,而是将主节点指向特性分支的最新提交。这是一种“快进”。传递--no-ff会创建一个新的提交来表示合并,即使 Git 通常会快进。在以下网址可以找到有用的相关解释: 365git.tumblr.com/post/504140728/fast-forward-merge

删除

要删除不必要的本地分支,请从主菜单中选择团队➤存储库浏览器。在 Git 存储库浏览器中,选择要删除的分支。该分支必须是非活动的,也就是说,当前没有检出到工作树中。

右键单击选定的分支,并从弹出菜单中选择“删除分支”。在“删除分支”窗口中,单击“确定”确认分支删除。

该分支从本地存储库中删除,这反映在 Git 存储库浏览器中。

使用远程存储库

当您与其他开发人员一起工作时,您需要共享您的工作,这涉及到从 Internet 或内部网络上托管的远程存储库获取、推送和提取数据。

在接下来的几节中,我们将研究每一个 Git 术语,并学习如何在 IDE 中执行这些操作。

迷人的

获取从原始远程存储库中获取您还没有的更改。它永远不会改变您的任何本地分支。获取从远程存储库中获取所有分支,您可以在任何时候将它们合并到您的分支中或者进行检查。

要获取更新,首先选择团队➤远程➤获取。从远程存储库提取向导打开,如图 10-18 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-18。

Fetch from Remote Repository wizard

在向导的“远程存储库”步骤中,选择“选择已配置的 Git 存储库位置”选项(使用之前配置的存储库的路径)或“指定 Git 存储库位置”选项(定义尚未访问的远程存储库的路径、其名称、登录名、密码和代理配置,如果需要)。单击下一步。在向导的远程分支步骤中,选择要从中提取更改的分支,然后单击 Finish。

创建远程分支的本地副本。所选分支在 Git 存储库浏览器的分支➤远程目录中更新。接下来,可以将获取的更新合并到本地分支中。

当从远程 Git 存储库中提取更新时,将从其中提取更改并合并到本地存储库的当前头中。要执行拉动,选择团队➤远程➤拉。“从远程存储库拉”向导打开,如图 10-19 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-19。

Pull from Remote Repository wizard

在向导的“远程存储库”步骤中,选择“选择已配置的 Git 存储库位置”选项(使用您之前配置的存储库的路径)或“指定 Git 存储库位置”选项(定义尚未访问的远程存储库的路径、其名称以及登录名和密码,如果需要)。单击下一步。在向导的“远程分支”页面中,选择将从中提取更改的分支,然后单击“完成”。

您的本地存储库与原始存储库同步。

当您要将您的提交推送到一个存储库中时,同时可能已经推送了一些其他的变更,您需要首先拉取并合并那些变更。

要将本地 Git 存储库中的更改贡献给公共 Git 存储库,请选择 Team ➤远程➤推送。Push to Remote Repository 向导打开,如图 10-20 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10-20。

Push to Remote Repository wizard

在向导的“远程存储库”步骤中,选择“选择已配置的 Git 存储库位置”选项(使用您之前配置的存储库的路径)或“指定 Git 存储库位置”选项(定义尚未访问的远程存储库的路径、其名称以及登录名和密码,如果需要)。单击下一步。在“选择本地分支”页面中,选择要将编辑内容推送至的分支,然后单击“下一步”。在“更新本地引用”页面中,选择要在本地存储库的 Remotes 目录中更新的分支。单击完成。

指定的远程资料库分支将使用本地分支的最新状态进行更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值