Java 性能优化系列之4[Java性能调优工具]

时间:2021-12-22 22:05:05

Linux 命令行工具

1.top 命令

实时显示系统中各个进程的资源占用状况。

top 命令的输出可以分为两个部分: 前半部分是系统统计信息, 后半部分是进程信息。

Java 性能优化系列之4[Java性能调优工具]

在统计信息中:

 第1行是任务队列信息,它的结果等同于uptime命令。从左到右依次表示: 系统当前时间、系统运行时间、当前登录用户数。 load average表示系统的平均负载,即任务队列的平均长度,这三个值分别表示1分钟、5分钟、15分钟到现在的平均值。

 第2行是进程统计信息,分别有正在运行的进程数、睡眠进程数、停止的进程数、僵尸进程数。

 第3行是CPU统计信息, us 表示用户空间CPU占有率、sy表示内核空间CPU占有率、ni表示用户进程空间改变优先级的进程CPU的占有率、id表示空闲CPU占有率、wa表示等待输入输出的CPU时间百分比、hi表示硬件中断请求、si表示软件中断请求; 在Mem行中, 从左到右,依次表示物理内存总量、已使用的物理内存、空闲物理内存、内核缓冲使用量。 Swap行依次表示交换区总量、空闲交换区大小、缓冲交换区大小。


top 命令的第2部分是进程信息区,显示了系统内各个进程的资源使用情况。

PID : 进程id

PPID: 父进程id

RUSER: Real user name

UID: 进程所有者的用户id

USER: 进程所有者的用户名

GROUP: 进程所有者的组名

TTY: 启动进程的终端名。 不是从终端启动的进程则显示为 ?

PR: 优先级

NI: nice值,负值表示高优先级,正值表示低优先级

P: 最后使用的CPU, 仅在多CPU环境下有意义

%CPU: 上次更新到现在的CPU时间占有百分比

TIME: 进程使用的CPU时间总计,单位秒

TIME+: 进程使用的CPU时间总计, 单位 1/100秒

%MEM: 进程使用的物理内存百分比

VIRT: 进程使用的虚拟内存总量, 单位KB

SWAP: 进程使用的虚拟内存中被换出的大小

RES: 进程使用的、未被换出的物理内存大小

CODE: 可执行代码占用的物理内存大小

DATA: 可执行代码以外的部分占有的物理内存大小

SHR: 共享内存大小

nFLT: 页面错误次数

nDRT: 最后一次写入到现在, 被修改过的页面数

S: 进程状态。D 表示不可中断的睡眠状态; R表示运行; S表示睡眠; T表示跟踪/停止; Z表示僵尸进程

COMMAND: 命令名/命令行

WCHAN: 若该进程正在睡眠,则显示睡眠中的系统函数名。

Flags: 任务标志。


在top 命令中, 按下f键, 可以进行列的选择, 使用o 键可以更改列的显示顺序。此外。 top 命令还有一些实用的交互指令

h : 显示帮助信息

k: 终止一个进程

q: 退出程序

c: 切换显示命令名称和完整命令行

M: 根据驻留内存大小进行排序

P: 根据CPU使用百分比大小进行排序

T: 根据时间/累计时间进行排序

数值1: 显示所有CPU负载情况


2.  sar 命令

sar 命令也是linux 系统中重要的性能监测工具之一, 它可以周期性地对内存和CPU使用情况进行采样

sar [options1] [<interval> [<count>]]

interval: 采样周期

count: 采样数量

-A :所有报告的总和

-u: CPU利用率

-d: 硬盘使用报告

-b: I/O 的情况

-q: 查看队列长度

-r: 内存使用统计信息

-n: 网络信息统计

-o: 采样结果输出到文件


3. vmstat

它可以统计CPU 内存使用情况、swap使用情况等信息。

和sar 类似, vmstat 也可以指定采样周期和采样次数

Java 性能优化系列之4[Java性能调优工具]

Java 性能优化系列之4[Java性能调优工具]


4. iostat 命令

提供详尽的I/O 信息。


5. pidstat 工具

一个功能强大的性能监测工具, 它也是Sysstat 的组件之一。 可以到

http://www.icewalkers.com/Linux/Software/59040/Sysstat.html

下载。 下载后安装即可。

pidstat 的强大之处在于, 它不仅可以监视进程的性能情况, 也可以监视线程的性能情况。

要监控程序的CPU使用率, 可以先使用jps 命令找到PID.然后使用pidstat命令输出程序的CPU使用情况。

pidstat 的参数-p 用于指定进程ID, -u 表示对CPU使用率的监控。

使用pidstat 可以

  -- CPU 使用率监控

  -- I/O 使用监控

  -- 内存监控


Windows 工具

1. 任务管理器

2. perfmon 性能监控工具

在命令行中使用  perfmon 命令。


3. Process Explorer

到 

https://technet.microsoft.com/en-us/sysinternals/bb896653 

下载。

Process Explorer 不仅显示了系统内所有的进程, 还进一步显示了进程 见的父子关系。


4. pslist 命令行

可以到:

https://technet.microsoft.com/en-us/sysinternals/bb896682

下载。

基本用法:

pslist [-d][-m][-x][-t][-s [n] [-r n] [name|pid]

-d 显示线程详细信息

-m 显示内存详细信息

-x: 心事进程、内存和线程信息

-t: 显示进程间父子关系

-s[n]: 进入监控模式。 n 指定程序运行时间, 使用ESC键退出。

-r n 指定监控模式下的刷新时间,单位为秒

name: 指定监控的进程名称

-e: 使用精确匹配

pid: 指定进程ID 



JDK 命令行工具

工具在JDK安装目录的bin 目录中

Java 性能优化系列之4[Java性能调优工具]

这些exe  可执行文件只是 Java程序的一层包装, 真正实现是在tools.jar中

以jps 工具为例, 执行这个exe 和使用命令行 

java -classpath %Java_HOME%/lib/tools.jar sun.tools.jps.Jps 命令是等价的。

1. jps 命令

类似于Linux下的ps, 但它只用于列出Java的进程。直接运行jps不加任何参数, 可以列出Java程序的进程ID以及Main函数等名称。

-q 指定jps 只输出进程ID

-m 用于输出传递给Java进程的参数

-l 用于输出主函数的完整路径

-v 可以显示传递给JVM的参数


2. jstat

可以用于观察Java应用程序运行时信息的工具。可以通过它,查看堆信息的详细情况, 基本使用语法为:

jstat -<option> [-t] [-h<lines>]<vmid>[<interval> [count]]

-class:  显示ClassLoader的相关信息

-compiler: 显示JIT编译的相关信息

-GC: 显示与GC相关的堆信息

-gccapacity: 显示各个代的容量及使用情况

-gccause: 显示垃圾收集相关信息, 同时显示最后一次或当前正在发生的垃圾收集的诱发原因

-gcnew: 显示新生代信息

-gcnewcapacity: 显示新生代大小与使用情况

-gcold: 显示老年代和永久代的信息

-gcoldcapacity: 显示永久代的大小

-gcutil: 显示垃圾收集信息

-printcompilation: 输出JIT编译的方法信息


-g 参数可以在输出信息前加上一个Timestamp列,显示程序的运行时间

-h 参数可以在周期性数据输出时,输出多少行数据后,跟着输出一个表头信息

interval 参数用于指定输出统计数据的周期,单位为毫秒

count 用于指定一共输出多少次数据


3. jinfo 命令

用来查看正在运行的Java 应用程序的扩展参数,甚至支持在运行时修改部分参数, 基本语法为:

jinfo <option><pid>

-flag<name>: 打印指定JVM的参数值

-flag [+|-]<name>: 设置指定JVM参数的布尔值

-flag <name>=<value>: 设置指定JVM参数的值


4.  jmap 命令

可以生成Java应用程序的堆快照和对象的统计信息

例如

jmap -histo 2972 >c:\s.txt


5. jhat 命令

用于分析Java 应用程序的堆快照内容。


6. jstack 命令

用于导出Java应用程序的线程堆栈:

jstack [-l] <pid>

-l: 用于打印锁的附加信息


7. jstatd

在以上工具中, 一些监控工具也支持对远程计算机的监控(jps,jstat). 为了启用远程监控,则需要配合使用jstatd工具。

Java 性能优化系列之4[Java性能调优工具]

8. hprof 工具

hprof 不是独立的监控工具,它只是一个Java agent工具,它可以用于监控Java应用程序在运行时的CPU信息和堆信息。



JConsole 工具


JConsole 工具是JDK自带的图形化性能监控工具。 可以查看Java应用程序的运行概况, 监控堆信息、永久区使用情况、类加载情况等。
1. JConsole连接Java程序 JConsole 程序在 %JAVA_HOME%/bin 目录下。 启动后, 可以连接本地进程也可以连接远端进程。 Java 性能优化系列之4[Java性能调优工具]

连接本地进程就不用多介绍了。 如果连接的是远程的进程。 则需要在远程Java应用程序启动时, 加上如下参数:
-Djava.rmi.server.hostname=127.0.0.1-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

-Djava.rmi.server.hostname 用于指定运行Java应用程序的计算机IP地址,
 -Dcom.sun.management.jmxremote.port 用于指定通过JMX管理该进程的端口号。

2. Java 程序概况  Java 性能优化系列之4[Java性能调优工具] 以上四张折线图显示了堆内存的使用情况、系统线程数量、加载类的数量以及CPU 的使用率
3. 使用插件 除了基本功能外, JConsole 还支持插件扩展. 在JDK的安装目录下, 就有一个自带的JConsole插件, 它位于 %JAVA_HOME%\demo\management\JTop 下。 可以使用如下命令让JConsole 加载插件并启动
jconsole -pluginpath %JAVA_HOME%/demo/management/JTop/JTop.jar
JTop 插件按照CPU 占用时间排序, 将占用CPU时间最长的线程显示在表格顶端。 器的哦 2. 

Visual VM 多合一工具


Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具, 它集成了多种性能统计工具的功能, 使用Visual VM可以代替jstat,jmap,jhat,jstack 甚至JConsle. 在JDK 6 Update 7 以后, Visual VM 便作为JDK的一部分发布, 它完全免费。 作为独立的软件安装, 也可以在http://visualvm.java.net 下载。 Visual VM也可以安装一些插件: Java 性能优化系列之4[Java性能调优工具]

可以通过离线下载插件文件 *.nbm, 然后在Plugin 对话框的Downloaded 页面下, 添加已下载的插件。
1. Visual VM 支持多种方式连接应用程序, 最常用的就是本地连接。只要本地计算机内有Java应用程序正在执行, 在Visual VM的Local 节点下, 就会出现这些应用。
双击应用程序或者右键打开, 就能够监控应用程序运行。由于Visual VM 本身也是Java应用程序, 因此, 自身也在列表内。 Java 性能优化系列之4[Java性能调优工具]