Jstat使用
/** * Jstate Example */ 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<String, Object> monitor = new HashMap<>(); List<String> 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 < stats.length; 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=========