作者: 一字马胡
转载标志 【2017-11-14】
更新日志
日期
更新内容
备注
2017-11-14
新建文章
初版
导入
ManagementFactory是一个为我们提供各种获取JVM信息的工厂类,使用ManagementFactory可以获取大量的运行时JVM信息,比如JVM堆的使用情况,以及GC情况,线程信息等,通过这些数据项我们可以了解正在运行的JVM的情况,以便我们可以做出相应的调整。本文将基于ManagementFactory,介绍如何通过ManagementFactory获取一些运行时的JVM信息,下面首先展示了ManagementFactory的类图,可以看出它提供了大量的工厂方法,使得我们可以通过调用这些方法来获取运行时的相关Bean,通过这些Bean就可以获取到我们想要的数据:
使用ManagementFactory
上文中展示的ManagementFactory类图直观的说明了ManagementFactory提供的一些方法,可以看出我们可以获取的内容很多,下面将挑选几个具有代表性的MXBean来作为使用示例。
线程:ThreadMXBean
首先,可以通过下面的方式来获取一个ThreadMXBean:
ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
下面的图片展示了ThreadMXBean支持的查询方法:
下面的代码展示了ThreadMXBean的使用方法,通过ThreadMXBean提供的方法,我们可以获取详细的运行时JVM内的线程信息:
private static Map collectThreadInfo() {
final ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
Map map = new LinkedHashMap();
map.put("jvm.thread.count", threadBean.getThreadCount());
map.put("jvm.thread.daemon.count", threadBean.getDaemonThreadCount());
map.put("jvm.thread.totalstarted.count", threadBean.getTotalStartedThreadCount());
ThreadInfo[] threadInfos = threadBean.getThreadInfo(threadBean.getAllThreadIds());
int newThreadCount = 0;
int runnableThreadCount = 0;
int blockedThreadCount = 0;
int waitThreadCount = 0;
int timeWaitThreadCount = 0;
int terminatedThreadCount = 0;
if (threadInfos != null) {
for (ThreadInfo threadInfo : threadInfos) {
if (threadInfo != null) {
switch (threadInfo.getThreadState()) {
case NEW:
newThreadCount++;
break;
case RUNNABLE:
runnableThreadCount++;
break;
case BLOCKED:
blockedThreadCount++;
break;
case WAITING:
waitThreadCount++;
break;
case TIMED_WAITING:
timeWaitThreadCount++;
break;
case TERMINATED:
terminatedThreadCount++;
break;
default:
break;
}
} else {
/*
* If a thread of a given ID is not alive or does not exist,
* the corresponding element in the returned array will,
* contain null,because is mut exist ,so the thread is terminated
*/
terminatedThreadCount++;
}
}
}
map.put("jvm.thread.new.count", newThreadCount);
map.put("jvm.thread.runnable.count", runnableThreadCount);
map.put("jvm.thread.blocked.count", blockedThreadCount);
map.put("jvm.thread.waiting.count", waitThreadCount);
map.put("jvm.thread.time_waiting.count", timeWaitThreadCount);
map.put("jvm.thread.terminated.count", terminatedThreadCount);
lon