部署过程描述如下:
1. 在需要监测的机器(我这里是 Linux 机器)部署相关应用:
a)在你需要进行监测的机器上安装 JDK1.5 (狂晕一阵子),别倒下(这个部分就不多说了,因为如果这里还要解释的话,那我就晕了)。
b)正确设置 Java 的运行环境。
c)启动 jstatd 进程。
命令如下: ./jstatd -J-Djava.security.policy=all.policy
一般来说呢,这里是会出现问题的,那就是 permission 的问题了,还好, Sun 的网站上给了相关的解决方法,方法如下,在 vi $JAVA_HOME/jre/lib/security/java.policy文件中添加下面的代码:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
然后重新启动 jstatd 进程。
d)完了,别让人乱动就好了,我经常是不小心就按 CTRL+C 把程序关闭了。
2. 在客户端(监控者使用的机器)的操作:
a)使用 jps 查看远端机器有哪些 JVM 进程在使用当中,命令如下:
jps 172.25.1.24 // 远端机器的 IP 地址或名称
屏幕输入如下:
13686 Jstatd
14115 XXXJavaServer
15117 Jserver
b)从上面可以看到远端机器的 Jstatd 进程已经启动起来了。我们就可以使用 jstat 对相关进程的具体情况进行查看。
Jstat 命令用法如下:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
解释如下:
Option 包括以下选项:
-class
-compiler
-gc
-gccapacity
-gccause
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-printcompilation
Vmid 就是 jps 查看到的进程 id ,如上 Jserver 的进程 id 是 15117 。
Interval 是时间间隔,单位为毫秒, 1000 就是一秒。
Count 就是需要查看的次数。
例子假设我们需要查看 172.25.1.24 机器 vmid 为 15117 的 gc 的情况,可以输入下面的命令:
jstat -gc 15117@172.25.1.24 1000 3
然后你能看到四行信息(一行为 title ,剩下的就是你要的信息了),仔细看看就可以发现很多信息的了。
c) 那么下面就开始配置可视化的监控包, jvmstat ,下载好了后,解压到任意目录。
执行 visualgc ,然后就可以看到可视化的监控窗口。
例:
java -Xbootclasspath/p:"c:\Program Files\Java\jdk1.5.0_06\lib\tools.jar" -jar e:\jvmstat-3_0\jvmstat\jars\visualgc.jar 9088@10.5.1.116成功执行后你就能看见一个 java 的监视窗口(样子还蛮专业的),这个时候就 可以开始监视了。
以下提供一个短程序,您可以运行来测试使用
jvmstat
进行监视。
StatGen.java import java.util.ArrayList; import java.util.List; public class StatGen { static final int MAX_BLOCK = 8*1024*100; public static void main(String[] args) { try{ int numLoops = 1; if (args.length > 0){ numLoops = Integer.parseInt(args[0]); } System.out.println("#loops="+numLoops); List<long[]> list = new ArrayList<long[]>(numLoops); for (int i=0;i<numLoops;i++){ int sz = (int) (Math.random()*MAX_BLOCK); long[] garbage = new long[sz]; if (sz % 5 == 0){ list.add(garbage); } System.out.println("Sleeping 0.5s"); Thread.sleep(500); } System.out.println("Done"); } catch (Throwable t) { t.printStackTrace(); } System.exit(0); } }