`
longgangbai
  • 浏览: 7252272 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JMX 和系统管理

阅读更多

          

检测虚拟机当前的状态总是 Java 开放人员所关心的,也正是因为如此,出现了大量的 profiler 工具来检测当前的虚拟机状态。从 Java SE 5 之后,在 JDK 中,我们有了一些 Java 的虚拟机检测 API,即 java.lang.management包。Management 包里面包括了许多 MXBean 的接口类和 LockInfo、MemoryUsage、MonitorInfo 和 ThreadInfo 等类。从名字可以看出,该包提供了虚拟机内存分配、垃圾收集(GC)情况、操作系统层、线程调度和共享锁,甚至编译情况的检测机制。这样一来,Java 的开发人员就可以很简单地为自己做一些轻量级的系统检测,来确定当前程序的各种状态,以便随时调整。

要获得这些信息,我们首先通过 java.lang.management.ManagementFactory这个工厂类来获得一系列的 MXBean。包括:

  • ClassLoadingMXBean

    ClassLoadMXBean 包括一些类的装载信息,比如有多少类已经装载 / 卸载(unloaded),虚拟机类装载的 verbose 选项(即命令行中的 Java – verbose:class 选项)是否打开,还可以帮助用户打开 / 关闭该选项。

  • CompilationMXBean

    CompilationMXBean 帮助用户了解当前的编译器和编译情况,该 mxbean 提供的信息不多。

  • GarbageCollectorMXBean

    相对于开放人员对 GC 的关注程度来说,该 mxbean 提供的信息十分有限,仅仅提供了 GC 的次数和 GC 花费总时间的近似值。但是这个包中还提供了三个的内存管理检测类:MemoryManagerMXBean,MemoryMXBean 和 MemoryPoolMXBean。

    • MemoryManagerMXBean

      这个类相对简单,提供了内存管理类和内存池(memory pool)的名字信息。

    • MemoryMXBean

      这个类提供了整个虚拟机中内存的使用情况,包括 Java 堆(heap)和非 Java 堆所占用的内存,提供当前等待 finalize 的对象数量,它甚至可以做 gc(实际上是调用 System.gc)。

    • MemoryPoolMXBean

      该信息提供了大量的信息。在 JVM 中,可能有几个内存池,因此有对应的内存池信息,因此,在工厂类中,getMemoryPoolMXBean() 得到是一个 MemoryPoolMXBean 的 list。每一个 MemoryPoolMXBean 都包含了该内存池的详细信息,如是否可用、当前已使用内存 / 最大使用内存值、以及设置最大内存值等等。

  • OperatingSystemMXBean

    该类提供的是操作系统的简单信息,如构架名称、当前 CPU 数、最近系统负载等。

  • RuntimeMXBean

    运行时信息包括当前虚拟机的名称、提供商、版本号,以及 classpath、bootclasspath 和系统参数等等。

  • ThreadMXBean

    在 Java 这个多线程的系统中,对线程的监控是相当重要的。ThreadMXBean 就是起到这个作用。ThreadMXBean 可以提供的信息包括各个线程的各种状态,CPU 占用情况,以及整个系统中的线程状况。从 ThreadMXBean 可以得到某一个线程的 ThreadInfo 对象。这个对象中则包含了这个线程的所有信息。

java.lang.management 和虚拟机的关系

我们知道,management 和底层虚拟机的关系是非常紧密的。其实,有一些的是直接依靠虚拟机提供的公开 API 实现的,比如 JVMTI;而另外一些则不然,很大一块都是由虚拟机底层提供某些不公开的 API / Native Code 提供的。这样的设计方式,保证了 management 包可以提供足够的信息,并且使这些信息的提供又有足够的效率;也使 management 包和底层的联系非常紧密。

 

package com.easyway.space.commons.systems;

import java.lang.management.ClassLoadingMXBean;
import java.lang.management.CompilationMXBean;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.LockInfo;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryManagerMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryType;
import java.lang.management.MemoryUsage;
import java.lang.management.MonitorInfo;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

/**
 * 系统监控工具
 * management 和底层虚拟机的关系是非常紧密的。其实,有一些的是直接依靠虚拟机提供的公
 * 开 API 实现的,比如 JVMTI;而另外一些则不然,很大一块都是由虚拟机底层提供某些不公开
 * 的 API / Native Code 提供的。这样的设计方式,保证了 management 包可以提供足够的信
 * 息,并且使这些信息的提供又有足够的效率;也使 management 包和底层的联系非常紧密。
 * @author longgangbai
 * 
 */
public class SystemUtils {

	/**
	 *ClassLoadingMXBean ClassLoadMXBean 包括一些类的装载信息,
	 * 比如有多少类已经装载 / 卸载(unloaded),
	 * 虚拟机类装载的 verbose 选项(即命令行中的 Java – verbose:class 选项)是否打开,
	 * 还可以帮助用户打开 / 关闭该选项。
	 */
	public static void getVMClassInformation(){
		
		ClassLoadingMXBean classLoadMXBean=ManagementFactory.getClassLoadingMXBean();
		
		int loadClazzCount=classLoadMXBean.getLoadedClassCount();
		System.out.println("加载类的数量:"+loadClazzCount);
		
		long hasloadClazzCount=classLoadMXBean.getTotalLoadedClassCount();
		System.out.println("已经加载类的数量:"+hasloadClazzCount);
		long hasUnloadClazzCount=classLoadMXBean.getUnloadedClassCount();
		System.out.println("尚未加载类的数量:"+hasUnloadClazzCount);
		boolean isVerbose=classLoadMXBean.isVerbose();
		System.out.println("是否开始加载类信息:"+isVerbose);
		//CompilationMXBean 帮助用户了解当前的编译器和编译情况,该 mxbean 提供的信息不多。
		CompilationMXBean compilationMXBean=ManagementFactory.getCompilationMXBean();
		String jitName=compilationMXBean.getName();
		System.out.println("即时编译的名称:"+jitName);
		long totalCompileTime=compilationMXBean.getTotalCompilationTime();
		System.out.println("总的编译时间:"+totalCompileTime+"/s");
		boolean isSupport=compilationMXBean.isCompilationTimeMonitoringSupported();
		if(isSupport){
			System.out.println("支持即时编译器编译监控");
		}else{
			System.out.println("不支持即时编译器编译监控");
		}
		List<GarbageCollectorMXBean> gcMXBeanList=ManagementFactory.getGarbageCollectorMXBeans();
		//相对于开放人员对 GC 的关注程度来说,该 mxbean 提供的信息十分有限,仅仅提供了 GC 的次数和 GC 花费总时间的近似值。
		for (GarbageCollectorMXBean gcMXBean : gcMXBeanList) {
			//内存池名称
			String[] poolNames=gcMXBean.getMemoryPoolNames();
			for (String poolName : poolNames) {
				System.out.println("poolNames="+poolName);
			}
		} 
		//提供了内存管理类和内存池(memory pool)的名字信息。
		List<MemoryManagerMXBean> memoryMgrMXBeanList=ManagementFactory.getMemoryManagerMXBeans();
		//内存管理器的信息
		for (MemoryManagerMXBean memoryManagerMXBean : memoryMgrMXBeanList) {
			String[] poolNames=memoryManagerMXBean.getMemoryPoolNames();
			for (String poolName : poolNames) {
				System.out.println("poolNames="+poolName);
			}
		}
		//内存信息
		MemoryMXBean memoryMXBean=ManagementFactory.getMemoryMXBean();
		//java堆得使用情况信息
		MemoryUsage heapMemoryUsage=memoryMXBean.getHeapMemoryUsage();
		long usaged=heapMemoryUsage.getUsed();
		System.out.println("java 内存堆使用内存:"+usaged);
		long maxUsage=heapMemoryUsage.getMax();
		System.out.println("java 内存堆最大使用内存:"+maxUsage);
		long initUsage=heapMemoryUsage.getInit();
		System.out.println("java 内存堆初始化时占用内存:"+initUsage);
		List<MemoryPoolMXBean> memoryPoolMXBeanList=ManagementFactory.getMemoryPoolMXBeans();
		//该信息提供了大量的信息。在 JVM 中,可能有几个内存池,因此有对应的内存池信息,因此,在工厂类中
		//,getMemoryPoolMXBean() 得到是一个 MemoryPoolMXBean 的 list。每一个 MemoryPoolMXBean 都包含
		//了该内存池的详细信息,如是否可用、当前已使用内存 / 最大使用内存值、以及设置最大内存值等等。
		for (MemoryPoolMXBean memoryPoolMXBean : memoryPoolMXBeanList) {
			//内存池的名称
			String poolName=memoryPoolMXBean.getName();
			//内存管理器的名称
			String[] memoryMgrNames=memoryPoolMXBean.getMemoryManagerNames();
			for (String mgrName : memoryMgrNames) {
				System.out.println("内存管理器的名称:"+mgrName);
			}
		    //java JVM最近内存的使用情况
			MemoryUsage memoryUsage=memoryPoolMXBean.getCollectionUsage();
			System.out.println("内存池的收集器内存使用率:"+memoryUsage.getUsed()/memoryUsage.getMax()+"%");
			memoryPoolMXBean.getCollectionUsageThreshold();
			
			memoryPoolMXBean.getCollectionUsageThresholdCount();
			MemoryType  memoryType=memoryPoolMXBean.getType();
			System.out.println("内存的信息:"+memoryType.name());
			MemoryUsage memoryUage=memoryPoolMXBean.getUsage();
			System.out.println("内存池的内存使用率:"+memoryUage.getUsed()/memoryUage.getMax()+"%");
			memoryPoolMXBean.getUsageThreshold();
			System.out.println();
			memoryPoolMXBean.getUsageThresholdCount();
			System.out.println();
		}
		//该类提供的是操作系统的简单信息,如构架名称、当前 CPU 数、最近系统负载等。
		OperatingSystemMXBean operateSystemMBean=ManagementFactory.getOperatingSystemMXBean();
		
		String operateName=operateSystemMBean.getName();
		System.out.println("操作系统的名称:"+operateName);
		
		int processListCount=operateSystemMBean.getAvailableProcessors();
		System.out.println("操作系统的进程数:"+processListCount);
		
		String osArchName=operateSystemMBean.getArch();//System.getProperty("os.arch");
		System.out.println("操作系统的架构:"+osArchName);
		
		double loadAverage=operateSystemMBean.getSystemLoadAverage();
		System.out.println("操作系统的负载均衡信息:"+loadAverage);
		
		String versionName=operateSystemMBean.getVersion();//System.getProperty("os.version");
		System.out.println("操作系统的版本号码:"+versionName);
		//运行时信息包括当前虚拟机的名称、提供商、版本号,以及 classpath、bootclasspath 和系统参数等等。
		RuntimeMXBean runtimeMXBean=ManagementFactory.getRuntimeMXBean();
		String vmName=runtimeMXBean.getVmName();
		System.out.println("虚拟机的名称:"+vmName);
		
		String vmVersion=runtimeMXBean.getVmVersion();
		System.out.println("虚拟机的版本:"+vmVersion);
		
		Map<String, String> sysMaps=runtimeMXBean.getSystemProperties();
		Set<Entry<String,String>> keyLists=sysMaps.entrySet();
		for (Entry<String, String> entry : keyLists) {
			System.out.println(entry.getKey()+":"+entry.getValue());
		}
		String vmVendor=runtimeMXBean.getVmVendor();
		System.out.println("系统的供应商的名称:"+vmVendor);
		
		//类加载器的路径
		String clazzPath=runtimeMXBean.getClassPath();//System.getProperty("java.class.path")}
		System.out.println("操作系统的类加载器的名称:"+clazzPath);
		
		List<String> argsList=runtimeMXBean.getInputArguments();
		System.out.println("操作系统的参数信息");
		for (String args : argsList) {
			System.out.println("  "+args);
		}
		
		String libPath=runtimeMXBean.getLibraryPath();// System.getProperty("java.library.path")
		System.out.println("java 的类库路径:"+libPath );
		
		String specVersion=runtimeMXBean.getManagementSpecVersion();
		System.out.println("实施运行Java虚拟机管理接口规范 的版本"+specVersion);
		
		String specName=runtimeMXBean.getSpecName();
		System.out.println("规范的名称:"+specName);
		
		String specVender=runtimeMXBean.getSpecVendor();
		System.out.println("规范管理接口供应商 :"+specVender);
		
		long startTime=runtimeMXBean.getStartTime();
		System.out.println("java 虚拟机的开始启动的时间:"+startTime);
		

		runtimeMXBean.getSpecVersion();
		System.out.println("规范接口版本::"+operateName);
		
		
		String bottClassPath =runtimeMXBean.getBootClassPath();
		System.out.println("操作系统的bootstrap 的classloader:"+bottClassPath);
		
		//在 Java 这个多线程的系统中,对线程的监控是相当重要的。ThreadMXBean 就是起到这个作用。
		//ThreadMXBean 可以提供的信息包括各个线程的各种状态,CPU 占用情况,以及整个系统中的线
		//程状况。从 ThreadMXBean 可以得到某一个线程的 ThreadInfo 对象。这个对象中则包含了这个
		//线程的所有信息。
		//线程的信息
		ThreadMXBean threadMXBean=ManagementFactory.getThreadMXBean();
		//所有的线程的编号
		long[] threadIds=threadMXBean.getAllThreadIds();
		for (long threadId : threadIds) {
			//线程的信息
			ThreadInfo  threadInfo=threadMXBean.getThreadInfo(threadId);
			//线程被阻塞的数量
			threadInfo.getBlockedCount();
			//被锁定线程的监控信息
			MonitorInfo[] monitorInfos=threadInfo.getLockedMonitors();
			for (MonitorInfo monitorInfo : monitorInfos) {
				int depth=monitorInfo.getLockedStackDepth();
				System.out.println("锁定的程度:"+depth);
			}
			//异步锁定的信息
			LockInfo[] lockinfos=threadInfo.getLockedSynchronizers();
			//锁定的信息
			for (LockInfo lockInfo : lockinfos) {
				System.out.println("锁定类的名称:"+lockInfo.getClassName());
			}
			//线程的名称
			String threadName=threadInfo.getThreadName();
			System.out.println("线程的名称:"+threadName);
			Thread.State state=threadInfo.getThreadState();
			System.out.println("线程的信息:"+state.name());
			
		}
		
		long cpuTime=threadMXBean.getCurrentThreadCpuTime();
		long curentTime=threadMXBean.getCurrentThreadUserTime();
		long threadCount=threadMXBean.getDaemonThreadCount();
		long peakliveThreadCount=threadMXBean.getPeakThreadCount();
		long threadCounts=threadMXBean.getThreadCount();
		System.out.println("当前处于live状态的线程总的数量:"+threadCounts);
		long totalThreadCount=threadMXBean.getTotalStartedThreadCount();
		System.out.println("JVM 启动之后,总的自动线程数量:"+totalThreadCount);
		
		
		
		
		
	}
	/**
	 * 
	 * @return
	 */
	public static final String getHeapMemoryUsage() {
		ClassLoadingMXBean mxbean;
		return ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
				.getUsed()
				+ "/"
				+ ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
						.getMax();
	}
    /**
     * 当前使用内存的百分比
     * @return
     */
	public static final String getHeapMemoryUsagePercent() {
		return (((double) ManagementFactory.getMemoryMXBean()
				.getHeapMemoryUsage().getUsed() / (double) ManagementFactory
				.getMemoryMXBean().getHeapMemoryUsage().getMax()) * 100L)
				+ "%";
	}
    /**
     * 当前非java堆占用的百分比
     * @return
     */
	public static final String getNonHeapMemoryUsage() {
		return ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
				.getUsed()
				+ "/"
				+ ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
						.getMax();
	}
	  /**
     * 
     * @return
     */
	public static final String getNonHeapMemoryUsagePercent() {
		return (((double) ManagementFactory.getMemoryMXBean()
				.getNonHeapMemoryUsage().getUsed() / (double) ManagementFactory
				.getMemoryMXBean().getNonHeapMemoryUsage().getMax()) * 100)
				+ "%";
	}
	  /**
     * 获取线程数
     * @return
     */
	public static final String getThreadCount() {
		return "" + ManagementFactory.getThreadMXBean().getThreadCount();
	}

}

 

分享到:
评论

相关推荐

    基于JMX的IT系统管理关键技术研究与实现

    基于JMX的IT系统管理关键技术研究与实现,详细介绍了使用jmx的方法

    论文研究-利用JMX改进网络管理系统中指标实时监控.pdf

    网络的迅速发展对现有网络管理系统的优化提出了迫切的...因此提出了一种利用JMX技术来改进网络管理系统中实时监控管理的一个实现模型。此模型有效地解决了实时监控中的网络拥塞、指标管理混乱、客户端负载过重等问题。

    论文研究-基于JMX的网络管理系统.pdf

    简单介绍了JMX规范,在此基础上,讨论了使用JMX体系结构建立网络管理程序的一般方法,最后结合JMX规范和实现方法,分析基于JMX网络管理系统的优势。

    系统用户管理.jmx

    Jmeter测试,实现一次登录,多次业务请求(批量生成并注册用户)。主要实现方式是通过setUp线程组设置登录请求,在循环控制器下使用beanshell脚本自动生成用户名、账号,...每一个元件的作用都写在comments(注释)里。

    网络游戏-基于JMX的网络业务管理方法及其应用系统.zip

    网络游戏-基于JMX的网络业务管理方法及其应用系统.zip

    mx4j 开发包,JMX的实现

    mx4j是jmx的开源框架实现,可实现系统开发的微内核管理

    JMX.rar_jmx_osgi

    JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。文件里面包含jmx开发5个常见的jar包,其中还有些example。

    java利用JMX做出不一样的的JVM.docx

    JMX 全称为 Java Management Extensions,翻译过来就是 Java 管理扩展,用来管理和监测 Java 程序。最常用到的就是对于 JVM 的监测和管理,比如 JVM 内存、CPU 使用率、线程数、垃圾收集情况等等。另外,还可以用作...

    JMX-how-to-use.rar_jmx_服务器_远程监控 文件

    光宇java的JMX远程服务器管理监控系统的帮助文件,说明了JMX在javaweb中的一些应用及应用方法。

    JMX in action.pdf

    JMX应该说是关于网络应用管理的的框架,如果你开发了一个比较复杂的系统,无疑你要提供这个系统的自身管理 系统,JMX更多应用是体现在Server上,如果你要使用java开发一个自己Server或复杂的应用系统,那么推荐你...

    jmx in action doc版

    JMX应该说是关于网络应用管理的的框架,如果你开发了一个比较复杂的系统,无疑你要提供这个系统的自身管理 系统,JMX更多应用是体现在Server上,如果你要使用java开发一个自己Server或复杂的应用系统,那么推荐你...

    javasnmp源码-02-jmx-demo:如何使用JMX来管理程序

    Extensions,用于我们管理和监控java应用程序。JMX有以下用途: 监控应用程序的运行状态和相关统计信息。 修改应用程序的配置(无需重启)。 状态变化或出错时通知处理。 举个例子,我们可以通过jconsole监控应用...

    毕业设计-基于Jmeter实现的在线压测和管理Jmx的平台.zip

    这里为你收集整理了关于毕业设计、课程设计可参考借鉴的资料一份,质量非常高,如果你投入时间去研究几天相信肯定对你有...对于任何因使用本资源而导致的问题,包括但不限于数据丢失、系统崩溃或安全漏洞,风险自担哦!

    利用Java内置的API开发JMX功能

    但如果是开发的一个复杂系统(如一个电商平台、一个企业内部管理系统),则该系统本身也需要被管理,如需要了解这个软件的运行情况,比如某些状态是否正常、当前登录用户数,还有可能需要动态的调整系统的某些参数,...

    论文研究-一种构件级动态集群管理系统的设计与实现.pdf

    设计并实现了一种构件级集群动态管理系统,支持在...它基于OSGi框架组织管理系统构件,并通过构件管理代理支持基于JMX的远程管理。最后通过实验展示了系统效果,最终验证了构件级管理在应对动态需求变化时的有效性。

    TongLINK/Q8.1相关文档

    管理控制台、TongLINKQ8.1系统管理手册_配置管理、TongLINKQ8.1系统管理手册_系统工具、TongLINKQ8.1系统开发手册_C#编程参考、TongLINKQ8.1系统开发手册_C编程参考、TongLINKQ8.1系统开发手册_JAVA编程参考、...

    TaylorManagement:是管理 JMX 库

    可以通过 WAS 远程服务器获取有关系统和 JVM 的信息。 它提供了一个直观的界面,因此任何人都可以轻松使用它。 如何使用 启动WAS时,一定要在JVM选项中添加以下选项(No Secure Mode方法) -Dcom.sun.management....

    jopr -jboss 工程师必备监控工具

    通过统一的图形化管理控制台,您可以管理和监控网络、操作系统、数据库等基础设施服务,也可以管理和监控Java虚拟机、JBoss Web、连接池等中间件,还可以通过自定义的JMX MBean管理和监控您的业务应用。通过对配置...

    基于微服务的车票管理系统源码+项目说明+sql数据库.tar

    功能描述:微服务车票系统,分管理员和普通用户两种角色。除了基本功能,可实现限流,一人一单,每日热搜等功能 #### 涉及技术栈:MySQL,Redis,RabbitMQ,MybatisPlus,SpringBoot,SpringCloud,Seata,Sentinel...

Global site tag (gtag.js) - Google Analytics