定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。java
在实际的故障排查、性能监控中,经常是操做系统的工具和Java虚拟机的工具结合使用。ios
top命令是Linux下经常使用的性能分析工具,可以实时显示系统中各个进程的资源占用状况。c++
在Linux使用top命令的部分输出以下:web
top命令的输出能够分为两个部分:前半部分是系通通计信息,后半部分是进程信息。shell
在统计信息中:浏览器
在进程信息区中,显示了系统各个进程的资源使用状况。主要字段的含义:缓存
vmstat也是一款功能比较齐全的性能监测工具。它能够统计CPU、内存使用状况、swap使用状况能信息。性能优化
通常vmstat工具的使用是经过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:bash
如下命令表示每秒采样一次,共三次。服务器
输出的各个列的含义:
分类 | 说明 |
---|---|
Procs | r: 运行队列中进程数量 b: 等待IO的进程数量 |
Memory(内存) | swpd: 使用虚拟内存大小 free: 可用内存大小 buff: 用做缓冲的内存大小 cache: 用做缓存的内存大小 |
Swap: | si: 每秒从交换区写到内存的大小 so: 每秒写入交换区的内存大小 IO:(如今的Linux版本块的大小为1024bytes) bi: 每秒读取的块数 bo: 每秒写入的块数 |
系统 | in: 每秒中断数,包括时钟中断 cs: 每秒上下文切换数 |
CPU(以百分比表示) | us: 用户进程执行时间(user time) sy: 系统进程执行时间(system time) id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 ,以百分比表示。 wa: 等待IO时间 |
iostat能够提供磁盘IO的监控数据:
avg-cpu: %user %nice %system %iowait %steal %idle 1.44 0.00 0.39 0.00 0.00 98.17 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.37 0.47 30.30 3561197 229837730 dm-0 0.44 0.33 29.97 2518272 227313194 dm-1 0.12 0.13 0.33 1013276 2520308 dm-2 0.00 0.00 0.00 502 2068
以上命令显示了CPU的使用概况和磁盘I/O的信息。
输出结果各个列的含义:
iostat结果面板 avg-cpu 描述的是系统cpu使用状况:
在web程序中,可能运行须要网络,可使用netstat命令监控网络流量。
netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:30037 *:* LISTEN udp 0 0 *:bootpc *:* Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 6135 /tmp/.X11-unix/X0 unix 2 [ ACC ] STREAM LISTENING 5140 /var/run/acpid.socket ...
以上命令表示列出全部端口信息。
除了咱们比较熟悉的java.exe、javac.exe这两个命令行工具,在jdk的bin目录下,还有一些其它的工具。。除了编译和运行Java程序外,打包、部署、签名、调试、监控、运维等各类场景均可能会用到它们。
jps相似Linux下的ps,它会列出Java程序的进程。
jps命令格式:
jps [ options ] [ hostid ]
jps命令示例:
jps的经常使用选项见表:
选项列表 | 描述 |
---|---|
-q | 只输出进程 ID,忽略主类信息 |
-l | 输出主类全名,或者执行 JAR 包则输出路径 |
-m | 输出虚拟机进程启动时传递给主类 main()函数的参数 |
-v | 输出虚拟机进程启动时的 JVM 参数 |
jsta是一个强大的工具。它能够显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。
jstat命令格式为:
jstat [ option vmid [interval[s|ms] [count]] ]
选项option表明用户但愿查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译情况。
以下,输出Java进程5728的ClassLoader相关信息,每秒统计一次信息,一共输出两次。
下例展现了与GC相关的堆信息的输出:
jstat工具主要选项:
选项列表 | 描述 |
---|---|
-class | 监视类加载、卸载数量、总空间以及类装载所耗费时长 |
-gc | 监视 Java 堆状况,包括 Eden 区、2 个 Survivor 区、老年代、永久代或者 jdk1.8 元空间等,容量、已用空间、垃圾收集时间合计等信息 |
-gccapacity | 监视内容与-gc 基本一致,但输出主要关注 Java 堆各个区域使用到的最大、最小空间 |
-gcutil | 监视内容与-gc 基本相同,但输出主要关注已使用空间占总空间的百分比 |
-gccause | 与 -gcutil 功能同样,可是会额外输出致使上一次垃圾收集产生的缘由 |
-gcnew | 监视新生代垃圾收集状况 |
-gcnewcapacity | 监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代垃圾收集状况 |
-gcoldcapacity | 监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间 |
-compiler | 输出即时编译器编译过的方法、耗时等信息 |
-printcompilation | 输出已经被即时编译的方法 |
jinfo的做用是实时查看和调整虚拟机各项参数。
jinfo命令格式:
jinfo [ option ] pid
下例显示了新生爱对象晋升老年代的最大年龄。在应用程序启动时,没有指定,但经过jinfo,查看该参数的当前数值。
查看是否打印GC详细信息:
jmap命令用于生成堆转储快照(通常称为heapdump或dump文件)
jmap的做用并不只仅是为了获取堆转储快照,它还能够查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪一种收集器等。
jmap命令格式:
jmap [ option ] vmid
以下,使用jmap生成PID为5728的Java程序的对象统计信息, 并输出到dump.txt中。
dump.txt的结构以下:
jmap更重要的功能是获得Java程序的当前堆快照:
如图,将应用程序的堆快照输出到D盘的heap.hprof文件中,以后,能够经过多种工具分析该堆文件。
jmap工具主要选项:
选项 | 描述 |
---|---|
-dump | 生成 Java 堆转储快照。 |
-finalizerinfo | 显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象。Linux平台 |
-heap | 显示 Java 堆详细信息,好比:用了哪一种回收器、参数配置、分代状况。Linux 平台 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
-permstat | 显示永久代内存状态,jdk1.7,永久代 |
-F | 当虚拟机进程对 -dump 选项没有响应式,能够强制生成快照。Linux平台 |
JDK提供jhat命令与jmap搭配使用,来分析jmap生成的堆转储快照。 jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,能够在浏览器中查看。
之前面生成的heap.hprof为例:
屏幕显示“Server is ready.”的提示后,用户在浏览器中输入http://localhost:7000/能够看到分析结果
jstack命令用于生成虚拟机当前时刻的线程快照(通常称为threaddump或者 javacore文件)。
jstack命令格式:
jstack [ option ] vmid
以下,使用stack查看线程堆栈的部分结果:
jstack工具主要选项:
选项 | 描述 |
---|---|
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-l | 除了堆栈外,显示关于锁的附加信息 |
-m | 若是调用的是本地方法的话,能够显示 c/c++的堆栈 |
在jdk1.7之后,新增了一个请打的命令行工具jcmd,它能够实现上面除了jstat外全部命令的功能。
例如,使用jcmd列出当前系统中的全部运行中的Java虚拟机:
jmcd命令格式:
jcmd <pid | main class> <command ... | PerfCounter.print | -f file>
jmcd工具主要选项:
选项 | 描述 | |
---|---|---|
help | 打印帮助信息,示例:jcmd help [] | |
ManagementAgent.stop | 中止JMX Agent | |
ManagementAgent.start_local | 开启本地JMX Agent | |
ManagementAgent.start | 开启JMX Agent | |
Thread.print | 参数-l打印java.util.concurrent锁信息,至关于:jstack | |
PerfCounter.print | 至关于:jstat -J-Djstat.showUnsupported=true -snap | |
GC.class_histogram | 至关于:jmap -histo | |
GC.heap_dump | 至关于:jmap -dump:format=b,file=xxx.bin | |
GC.run_finalization | 至关于:System.runFinalization() | |
GC.run | 至关于:System.gc() | |
VM.uptime | 参数-date打印当前时间,VM启动到如今的时候,以秒为单位显示 | |
VM.flags | 参数-all输出所有,至关于:jinfo -flags , jinfo -flag | |
VM.system_properties | 至关于:jinfo -sysprops | |
VM.command_line | 至关于:jinfo -sysprops | grep command |
VM.version | 至关于:jinfo -sysprops | grep version |
参考:
【1】:周志朋编著《深刻理解Java虚拟机:JVM高级特性与最佳实践》
【2】:《Java性能权威指南》
【3】:《实战JAVA虚拟机 JVM故障诊断与性能优化》
【4】:jcmd命令详解