JVM故障诊断与性能优化-性能监控工具(五)

Linux下的性能监控工具

1.显示系统整体资源使用情况-top命令



2.监控内存和CPU-vmstat命令

vmstat 1 3


示例1--使用vmstat查看java程序占用内存情况

package chapter6;

import java.util.Random;

//去package名放入linux中运行
public class HoldLockMain {
	public static Object[] lock = new Object[10];
	public static Random r = new Random();
	static{
		for (int i = 0; i < lock.length; i++) {
			lock[i] = new Object();
		}
	}
	public static class HoldLockTask implements Runnable{
		private int i;
		public HoldLockTask(int i) {
			super();
			this.i = i;
		}
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
				while(true){
					synchronized (lock[i]) {
						if(i%2==0)
							lock[i].wait(r.nextInt(10));
						else
							lock[i].notifyAll();
					}
				}
			}catch(Exception e){
			}
		}
	}
	public static void main(String[] args) {
		for (int i = 0; i < lock.length*2; i++) {
			new Thread(new HoldLockTask(i/2)).start();
		}
	}
}

3.监控IO使用-iostat


示例2--使用io监控

package chapter6;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class HostIOMian {
	public static class HoldIOTask implements Runnable{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(true){
				try{
					FileOutputStream fos = new FileOutputStream(new File("temp"));
					for(int i=0;i<10000;i++)
						fos.write(i);
					fos.close();
					FileInputStream fis = new FileInputStream(new File("temp"));
					while(fis.read()!=-1);
				}catch(Exception e){
				}
			}
		}
	}
	public static class LazyTask implements Runnable{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
				while(true){
					Thread.sleep(1000);
				}
			}catch(Exception e){
			}
		}
	}
	public static void main(String[] args) {
		new Thread(new HoldIOTask()).start();
		new Thread(new LazyTask()).start();
		new Thread(new LazyTask()).start();
		new Thread(new LazyTask()).start();
	}
}
[root@localhost bin]# jps
3889 Jps
3874 HostIOMian
[root@localhost bin]# pidstat -p 3874 -d -t 1 3
Linux 2.6.32-696.el6.x86_64 (localhost.localdomain) 	06/13/2018 	_x86_64_	(1 CPU)

09:02:25 PM      TGID       TID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
09:02:26 PM      3874         -      0.00    867.33    217.82  java
09:02:26 PM         -      3874      0.00      0.00      0.00  |__java
09:02:26 PM         -      3875      0.00      0.00      0.00  |__java
09:02:26 PM         -      3876      0.00      0.00      0.00  |__java
09:02:26 PM         -      3877      0.00      0.00      0.00  |__java
09:02:26 PM         -      3878      0.00      0.00      0.00  |__java
09:02:26 PM         -      3879      0.00      0.00      0.00  |__java
09:02:26 PM         -      3880      0.00      0.00      0.00  |__java
09:02:26 PM         -      3881      0.00      0.00      0.00  |__java
09:02:26 PM         -      3882      0.00      0.00      0.00  |__java
09:02:26 PM         -      3883      0.00    867.33    217.82  |__java
09:02:26 PM         -      3884      0.00      0.00      0.00  |__java
09:02:26 PM         -      3885      0.00      0.00      0.00  |__java
09:02:26 PM         -      3886      0.00      0.00      0.00  |__java

09:02:26 PM      TGID       TID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
09:02:27 PM      3874         -      0.00    848.48    210.10  java
09:02:27 PM         -      3874      0.00      0.00      0.00  |__java
09:02:27 PM         -      3875      0.00      0.00      0.00  |__java
09:02:27 PM         -      3876      0.00      0.00      0.00  |__java
09:02:27 PM         -      3877      0.00      0.00      0.00  |__java
09:02:27 PM         -      3878      0.00      0.00      0.00  |__java
09:02:27 PM         -      3879      0.00      0.00      0.00  |__java
09:02:27 PM         -      3880      0.00      0.00      0.00  |__java
09:02:27 PM         -      3881      0.00      0.00      0.00  |__java
09:02:27 PM         -      3882      0.00      0.00      0.00  |__java
09:02:27 PM         -      3883      0.00    848.48    210.10  |__java
09:02:27 PM         -      3884      0.00      0.00      0.00  |__java
09:02:27 PM         -      3885      0.00      0.00      0.00  |__java
09:02:27 PM         -      3886      0.00      0.00      0.00  |__java

09:02:27 PM      TGID       TID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
09:02:28 PM      3874         -      0.00    791.58    202.11  java
09:02:28 PM         -      3874      0.00      0.00      0.00  |__java
09:02:28 PM         -      3875      0.00      0.00      0.00  |__java
09:02:28 PM         -      3876      0.00      0.00      0.00  |__java
09:02:28 PM         -      3877      0.00      0.00      0.00  |__java
09:02:28 PM         -      3878      0.00      0.00      0.00  |__java
09:02:28 PM         -      3879      0.00      0.00      0.00  |__java
09:02:28 PM         -      3880      0.00      0.00      0.00  |__java
09:02:28 PM         -      3881      0.00      0.00      0.00  |__java
09:02:28 PM         -      3882      0.00      0.00      0.00  |__java
09:02:28 PM         -      3883      0.00    791.58    202.11  |__java
09:02:28 PM         -      3884      0.00      0.00      0.00  |__java
09:02:28 PM         -      3885      0.00      0.00      0.00  |__java
09:02:28 PM         -      3886      0.00      0.00      0.00  |__java

Average:         TGID       TID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
Average:         3874         -      0.00    836.61    210.17  java
Average:            -      3874      0.00      0.00      0.00  |__java
Average:            -      3875      0.00      0.00      0.00  |__java
Average:            -      3876      0.00      0.00      0.00  |__java
Average:            -      3877      0.00      0.00      0.00  |__java
Average:            -      3878      0.00      0.00      0.00  |__java
Average:            -      3879      0.00      0.00      0.00  |__java
Average:            -      3880      0.00      0.00      0.00  |__java
Average:            -      3881      0.00      0.00      0.00  |__java
Average:            -      3882      0.00      0.00      0.00  |__java
Average:            -      3883      0.00    836.61    210.17  |__java
Average:            -      3884      0.00      0.00      0.00  |__java
Average:            -      3885      0.00      0.00      0.00  |__java
Average:            -      3886      0.00      0.00      0.00  |__java
[root@localhost bin]# pidstat -r -p 3874 1 5//内存监控
Linux 2.6.32-696.el6.x86_64 (localhost.localdomain) 	06/13/2018 	_x86_64_	(1 CPU)

09:02:48 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
09:02:49 PM      3874      0.00      0.00  377968  14896   1.47  java
09:02:50 PM      3874      0.00      0.00  377968  14896   1.47  java
09:02:51 PM      3874      0.00      0.00  377968  14896   1.47  java
09:02:52 PM      3874      0.00      0.00  377968  14896   1.47  java
09:02:53 PM      3874      0.00      0.00  377968  14896   1.47  java
Average:         3874      0.00      0.00  377968  14896   1.47  java


4.多功能诊断器-pidstat

1.安装sysstat工具


示例3--使用pisstat查看进程信息

package chapter6;

public class HoldCPUMain {
	public static class HoldCPUTask implements Runnable{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(true){
				double a = Math.random()*Math.random();
			}
		}
	}
	public static class LazyTask implements Runnable{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
				while(true){
					Thread.sleep(1000);
				}
			}catch(Exception e){
			}
		}
	}
	public static void main(String[] args) {
		new Thread(new HoldCPUTask()).start();
		new Thread(new LazyTask()).start();
		new Thread(new LazyTask()).start();
		new Thread(new LazyTask()).start();
	}
}

使用-p参数进一步查看进程信息:

[root@localhost bin]# pidstat -p 3591 1 3 -u -t
Linux 2.6.32-696.el6.x86_64 (localhost.localdomain) 	06/13/2018 	_x86_64_	(1 CPU)

08:44:56 PM      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
08:44:57 PM      3591         -  100.00    0.00    0.00  100.00     0  java
08:44:57 PM         -      3591    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3592    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3593    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3594    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3595    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3596    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3597    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3598    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3599    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3600  100.00    0.00    0.00  100.00     0  |__java
08:44:57 PM         -      3601    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3602    0.00    0.00    0.00    0.00     0  |__java
08:44:57 PM         -      3603    0.00    0.00    0.00    0.00     0  |__java

08:44:57 PM      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
08:44:58 PM      3591         -   99.00    0.00    0.00   99.00     0  java
08:44:58 PM         -      3591    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3592    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3593    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3594    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3595    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3596    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3597    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3598    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3599    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3600   99.00    0.00    0.00   99.00     0  |__java
08:44:58 PM         -      3601    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3602    0.00    0.00    0.00    0.00     0  |__java
08:44:58 PM         -      3603    0.00    0.00    0.00    0.00     0  |__java

08:44:58 PM      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
08:44:59 PM      3591         -   97.03    0.00    0.00   97.03     0  java
08:44:59 PM         -      3591    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3592    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3593    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3594    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3595    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3596    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3597    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3598    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3599    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3600   97.03    0.00    0.00   97.03     0  |__java
08:44:59 PM         -      3601    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3602    0.00    0.00    0.00    0.00     0  |__java
08:44:59 PM         -      3603    0.00    0.00    0.00    0.00     0  |__java

Average:         TGID       TID    %usr %system  %guest    %CPU   CPU  Command
Average:         3591         -   98.67    0.00    0.00   98.67     -  java
Average:            -      3591    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3592    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3593    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3594    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3595    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3596    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3597    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3598    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3599    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3600   98.67    0.00    0.00   98.67     -  |__java
Average:            -      3601    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3602    0.00    0.00    0.00    0.00     -  |__java
Average:            -      3603    0.00    0.00    0.00    0.00     -  |__java

使用jstack查看java应用程序所有线程信息:


可以看到两者的进程id相同(e10==3600)

2.Windows下性能监控工具

1.perform性能监控工具

示例4--使用perfmon

1.运行HoldCPUMain类。

2.在运行中输入“perfmon”打开性能监视器。

3.右击折线图添加计数器,选择Threads,搜索java,选中所有搜索的实例添加到计数器中


5.更换显示模式,以报表查看


可以看到,线程id为12892的线程占用很高的cpu。


使用jstack查看应用线程得


可以看到线程id相同(0x325c==12892)

2.process explorer进程管理工具

示例5--使用process explorer查看应用进程

1.下载processexplorer。

2.运行HoldLockMain,在processexplorer中进行查看


右击应用程序的进程,查看线程信息:


使用jstack查看线程信息


可以看到两者查看的线程信息相同

3.命令行工具--pslist

示例6--使用pslist查看应用线程

1.下载pslist工具,在命令行打开

2.运行HoldCPUTask程序

3.使用pslist java查看应用进程:


4.使用pslist java -d查看线程信息


5.使用jstack查看线程信息:


两者查看的线程信息相同。

JDK性能监控工具

猜你喜欢

转载自blog.csdn.net/yinweicheng/article/details/80698644