使用Java代码运行jstat命令并获取JVM运行信息
先来了解一下java.lang.management包的基本信息,提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。
下面代码就是使用了该软件包的类,获取当前运行的java程序的pid,然后运行jstat命令获取jvm的运行信息,
package com.usoft.sort;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.management.ManagementFactory;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by xinxingegeya on 16/4/12.
*/
public class JstatMain {
/**
* S0 — Heap上的 Survivor space 0 区已使用空间的百分比
* S1 — Heap上的 Survivor space 1 区已使用空间的百分比
* E — Heap上的 Eden space 区已使用空间的百分比
* O — Heap上的 Old space 区已使用空间的百分比
* M — Metaspace区已使用空间的百分比
* CCS-Compressed class space capacity (kB)
* YGC — 从应用程序启动到采样时发生 Young GC 的次数
* YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
* FGC — 从应用程序启动到采样时发生 Full GC 的次数
* FGCT-从应用程序启动到采样时 Full GC 所用的时间(单位秒)
* GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
*/
public static void main(String args[]) throws IOException {
Map monitor = new HashMap<>();
List statColumn = Arrays.asList("S0", "S1", "E", "O", "M", "CCS", "YGC", "YGCT", "FGC", "FGCT", "GCT");
String name = ManagementFactory.getRuntimeMXBean().getName();
System.out.println(name);
String pid = name.substring(0, name.indexOf("@"));
Process process = Runtime.getRuntime().exec("jstat -gcutil " + pid + " 5000");
//通过process拿到jstat命令的执行结果的输入流
InputStreamReader isr = new InputStreamReader(process.getInputStream());
BufferedReader bufferedReader = new BufferedReader(isr);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
String[] stats = line.trim().split("[ ]+");
if (stats.length == statColumn.size()) {
for (int i = 0; i
monitor.put(statColumn.get(i), stats[i]);
System.out.println(statColumn.get(i) + ":" + stats[i]);
}
System.out.println("=====");
}
}
}
}
运行结果,
1142@Yale-Li
S0:S0
S1:S1
E:E
O:O
M:M
CCS:CCS
YGC:YGC
YGCT:YGCT
FGC:FGC
FGCT:FGCT
GCT:GCT
=====
S0:0.00
S1:0.00
E:16.01
O:0.00
M:17.19
CCS:19.74
YGC:0
YGCT:0.000
FGC:0
FGCT:0.000
GCT:0.000
=====
S0:0.00
S1:0.00
E:16.01
O:0.00
M:17.19
CCS:19.74
YGC:0
YGCT:0.000
FGC:0
FGCT:0.000
GCT:0.000
=====
=========END=========