Windows工具

作为桌面市场的引领者,Windows平台上也运行着大量的Java应用程序。本节主要介绍一些可以工作在Windows平台上的性能监控工具,包括Windows系统自带的任务管理器、性能监控工具,以及一些优秀的第三方工具。

一,任务管理器

Windows系统的任务管理器是大家最为熟知的一款系统工具,通过Ctrl Alt Del组合键便能调出。任务管理器乍看之下并不起眼,但事实上它却是使用最为方便、功能也非常强大的一款性能统计工具。任务管理器的界面如图1所示。

可以看到,任务管理器的进程页罗列了系统内进程的名称、所属用户、CPU使用率和内存使用量等信息。通过任务管理器,可以方便地实时监控各个进程的CPU和内存使用情况,这对于简单的性能监控已经足够了。

除了图1中所展示的列外,任务管理器的进程页面还可以显示更多的性能参数,如进程ID和I/O信息等,如图2所示。

java程序所需要的基本系统配置(太细了堪称完美总结)(1)

1.任务管理器界面

java程序所需要的基本系统配置(太细了堪称完美总结)(2)

2.任务管理器支持的统计类型

选择“查看”菜单的“选择列”命令,打开“选择列”对话框(如图2所示),在此可以选择需要监控的列信息。如图3所示,笔者将任务管理器调整为一个只显示进程名称、PID、CPU使用率、内存使用量和I/O情况的进程性能监控工具。

java程序所需要的基本系统配置(太细了堪称完美总结)(3)

3.通过任务管理器显示内存和I/O情况

除了对进程进行单独的监控外,任务管理器还能对计算机系统的整体运行情况进行监控,包括CPU、内存及网络的使用情况。图4展示了CPU的实际使用率和内存使用情况,图5展示了当前的网络使用情况。

java程序所需要的基本系统配置(太细了堪称完美总结)(4)

4.CPU和内存使用情况

java程序所需要的基本系统配置(太细了堪称完美总结)(5)

5.网络使用情况

注意:任务管理器很常用,也非常强大,它可以显示系统的网络负载、任意进程的CPU占用率、内存使用量及I/O使用情况。

二,perfmon性能监控工具

与任务管理器相比,perfmon工具可以说是Windows下专业级的性能监控工具了。它的功能极其强大,不仅可以监控计算机系统的整体运行情况,也可以专门针对某一个进程或者线程进行状态监控。而且,它所支持的监控对象也非常多,几乎涉及系统的所有方面,从CPU使用情况到内存利用率、I/O速度、网络使用状况、进程数、线程等,无不在其监控范围内。perfmon工具的运行界面如图6所示。

读者可以在任务栏的“开始”菜单中选择“运行”命令,在弹出的“运行”对话框中使用perfmon命令,或者在控制面板的管理工具中双击“性能”快捷方式打开perfmon工具,如图7所示。

perfmon工具的底部表格显示了当前正在监控的系统对象。可以在监控对象表格中右击,在弹出的快捷菜单中选择“添加计数器”命令,在弹出的“添加计数器”对话框中选择需要监控的对象,如图8所示。

java程序所需要的基本系统配置(太细了堪称完美总结)(6)

6.perfmon运行界面

java程序所需要的基本系统配置(太细了堪称完美总结)(7)

7.打开perfmon的方式

可以看到,perfmon工具支持的监控对象很多,但一般来说,读者只需要关注图8中用箭头标注的几项即可。

Process表示系统进程,Processor表示系统处理器,Thread表示系统线程。选中Process后,在右边的列表中会列出系统内的所有进程,用户可以进一步选择要监控的进程对象。同理,Processor会列出系统内所有的CPU处理器,Thread则可以列出系统内所有的线程。

读者应该还记得在介绍pidstat工具(6.1.5节)时使用的HoldCPUMain程序吧,本节将以该程序为例,展示如何使用perfmon工具找出在Java应用程序中最消耗CPU资源的线程。

首先运行HoldCPUMain,然后按照如图9所示的配置,设置测量对象为Thread,并选择Java.exe进程中所有的线程。

java程序所需要的基本系统配置(太细了堪称完美总结)(8)

9.选择要监控的线程

单击“查看报表”按钮,切换perfmon工具的显示模式,如图10所示。

java程序所需要的基本系统配置(太细了堪称完美总结)(9)

10.切换显示模式

在报表中可以很容易找到,在当前的Java应用程序中,线程ID为2548的线程占用了很高的CPU,如图11所示。

java程序所需要的基本系统配置(太细了堪称完美总结)(10)

11.线程监控结果

将2548换算成十六进制为9f4。通过jstack等工具导出Java应用程序的线程快照,并查找9f4,即可找到对应的线程代码,显示如下:

java程序所需要的基本系统配置(太细了堪称完美总结)(11)

至此完成线程定位,即通过perfmon工具找到了Java程序中消耗CPU最多的线程代码。

注意:perform工具也是Windows自带的一款性能监控软件,可以监控的性能指标繁多,功能也非常强大。当任务管理器无法满足要求时,推荐使用该工具。

三,ProcessExplorer工具

ProcessExplorer是一款功能极其强大的进程管理工具,完全可以替代Windows自带的任务管理器。读者可以

在http://technet.microsoft.com/en-us/sysinternals/bb896653上下载该工具。ProcessExplorer的运行主界面如图12所示。

java程序所需要的基本系统配置(太细了堪称完美总结)(12)

12,ProcessExplorer的运行主界面

ProcessExplorer不仅显示了系统内所有的进程,还进一步显示了进程间的父子关系。ProcessExplorer所支持的测量项非常多。可以在表格头部右击,选择SelectColumns命令,打开对话框,选择需要统计的策略项。如图6.13所示,ProcessExplorer将统计项进行了分类,主要有进程模块信息、进程性能、I/O使用情况、网络使用情况、内存使用情况等选项卡。

在进程中右击,选择属性命令,可以显示选中进程的详细信息,包括线程数、上下文环境、CPU、I/O和内存使用情况等。

java程序所需要的基本系统配置(太细了堪称完美总结)(13)

13.进程性能统计类型

在6.1.3节的“vmstat命令”中,使用了名为Hold-LockMain的例子,演示了一个大量线程切换的场景。这里继续使用该示例,演示ProcessExplorer的使用方法。

首先运行HoldLockMain,在ProcessExplorer中可以看到,该Java程序占用了很高的CPU,如图14所示。

java程序所需要的基本系统配置(太细了堪称完美总结)(14)

14.ProcessExplorer监控CPU占用率

右击javaw.exe,打开属性对话框,在其中查看线程页,如图15所示。

java程序所需要的基本系统配置(太细了堪称完美总结)(15)

15.查看线程情况

可以看到,在该Java程序中,线程的上下文切换数值和CPU占用率都比较大。查看当前CPU占用率达12%、上下文切换达163次的线程ID为2864的线程,换算成十六进制为b30。在线程快照中,查找b30对应的线程,有以下结果:

java程序所需要的基本系统配置(太细了堪称完美总结)(16)

java程序所需要的基本系统配置(太细了堪称完美总结)(17)

至此,通过ProcessExplorer便找到了其中消耗CPU资源的一个线程。在实际开发过程中,使用类似的方法便可以找出程序中最为消耗资源的线程。

注意:ProcessExplorer可以认为是一个加强版的任务管理器,但它不是Windows系统自带的工具,需要下载后安装。

四,pslist命令行

与之前介绍的性能监控工具不同,pslist工具是一款Windows下的命令行工具。虽然与之前的GUI工具相比,命令行工具在易用性上略有不足,但它依然具有GUI工具所不能替代的功能与用途。读者可以在http://technet.microsoft.com/en-us/sysinternals/bb896682上下载并安装该工具。

pslist的基本用法如下:

java程序所需要的基本系统配置(太细了堪称完美总结)(18)

各参数的含义如下:

本节依然延用在6.1.5节中“pidstat工具”给出的HoldCPUTask示例。首先运行HoldCPUTask程序,然后使用pslist列出所有的Java应用程序进程,执行命令如下:

java程序所需要的基本系统配置(太细了堪称完美总结)(19)

使用-d参数列出线程信息:

java程序所需要的基本系统配置(太细了堪称完美总结)(20)

找到运行中具有最高Cswtch(上下文切换)值的线程2548,换算成十六进制为9f4(很明显,该线程也是占用CPU时间最多的线程)。在线程快照中查找这个线程ID,结果如下:

java程序所需要的基本系统配置(太细了堪称完美总结)(21)

这样可以找到当前最消耗CPU的线程HoldCPUTask。

注意:pslist是Windows下的命令行工具,它可以显示进程乃至线程的详细信息。

,