rmi连接:
1)首先在被监控的JVM的启动参数中加入如下的启动参数以启JVM代理
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://127.0.0.1:8000/jmxrmi"); JMXConnector connector = JMXConnectorFactory.connect(url); RuntimeMXBean rmxb = <span style="BACKGROUND-COLOR: #00ff40; COLOR: black; " id="casearchresult"><strong>ManagementFactory</strong></span>.newPlatformMXBeanProxy(connector .getMBeanServerConnection(),"java.lang:type=Runtime", RuntimeMXBean.class);
attacj进程
//Attach 到5656的JVM进程上,后续Attach API再讲解 VirtualMachine virtualmachine = VirtualMachine.attach("5656"); //让JVM加载jmx Agent,后续讲到Java Instrutment再讲解 String javaHome = virtualmachine.getSystemProperties().getProperty("java.home"); String jmxAgent = javaHome + File.separator + "lib" + File.separator + "management-agent.jar"; virtualmachine.loadAgent(jmxAgent, "com.sun.management.jmxremote"); //获得连接地址 Properties properties = virtualmachine.getAgentProperties(); String address = (String)properties.get("com.sun.management.jmxremote.localConnectorAddress"); //Detach virtualmachine.detach(); JMXServiceURL url = new JMXServiceURL(address); JMXConnector connector = JMXConnectorFactory.connect(url); RuntimeMXBean rmxb = <span style="BACKGROUND-COLOR: #00ff40; COLOR: black; " id="casearchresult"><strong>ManagementFactory</strong></span>.newPlatformMXBeanProxy(connector .getMBeanServerConnection(), "java.lang:type=Runtime",RuntimeMXBean.class);
*****************************************************************************************
ClassLoadingMXBean Java 虚拟机的类加载系统。
CompilationMXBean Java 虚拟机的编译系统。
MemoryMXBean Java 虚拟机的内存系统。
ThreadMXBean Java 虚拟机的线程系统。
RuntimeMXBean Java 虚拟机的运行时系统。
OperatingSystemMXBean Java 虚拟机在其上运行的操作系统。
GarbageCollectorMXBean Java 虚拟机中的垃圾回收器。
MemoryManagerMXBean Java 虚拟机中的内存管理器。
MemoryPoolMXBean Java 虚拟机中的内存池。
实例代码:
import java.lang.management.ClassLoadingMXBean; import java.lang.management.CompilationMXBean; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.ThreadMXBean; import java.lang.management.RuntimeMXBean; import java.lang.management.OperatingSystemMXBean; import java.lang.management.MemoryPoolMXBean; import java.util.List; public class JVM { public static void main(String[] args) { //Java 虚拟机线程系统的管理接口 ThreadMXBean ThreadMXBean th=(ThreadMXBean)ManagementFactory.getThreadMXBean() ; System.out.println("活动线程的当前数目"+th.getThreadCount()); System.out.println("返回活动守护线程的当前数目"+th.getDaemonThreadCount()); System.out.println("Java 虚拟机启动或峰值重置以来峰值活动线程计数"+th.getPeakThreadCount()); System.out.println("返回当前线程的总 CPU 时间"+th.getCurrentThreadUserTime()); System.out.println("当前线程在用户模式中执行的 CPU 时间"+th.getCurrentThreadUserTime()); //Java 虚拟机的运行时系统的管理接口。 RuntimeMXBean RuntimeMXBean run=(RuntimeMXBean)ManagementFactory.getRuntimeMXBean(); System.out.println("正在运行的 Java 虚拟机的名称"+run.getName()); System.out.println("Java 虚拟机规范名称"+run.getSpecName()); System.out.println("返回 Java 库路径"+run.getLibraryPath()); System.out.println("系统类加载器用于搜索类文件的 Java 类路径"+run.getClassPath()); //用于操作系统的管理接口,Java 虚拟机在此操作系统上运行 OperatingSystemMXBean OperatingSystemMXBean op=(OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean(); System.out.println("返回操作系统的架构"+op.getArch()); System.out.println("返回操作系统名称"+op.getName()); System.out.println("返回操作系统的版本"+op.getVersion()); System.out.println("Java 虚拟机可以使用的处理器数目"+op.getAvailableProcessors()); //内存池的管理接口。内存池表示由 Java 虚拟机管理的内存资源, //由一个或多个内存管理器对内存池进行管理 MemoryPoolMXBean List<MemoryPoolMXBean> list=ManagementFactory.getMemoryPoolMXBeans(); for(MemoryPoolMXBean mem:list){ System.out.println("Java 虚拟机启动以来或自峰值重置以来此内存池的峰值内存使用量"+mem.getPeakUsage()); System.out.println("返回此内存池的类型"+mem.getType()); System.out.println("内存使用量超过其阈值的次数"+ mem.getUsage()); } //Java 虚拟机内存系统的管理接口。 MemoryMXBean MemoryMXBean mem=(MemoryMXBean)ManagementFactory.getMemoryMXBean(); System.out.println(" 返回用于对象分配的堆的当前内存使用量"+mem.getHeapMemoryUsage()); System.out.println("Java 虚拟机使用的非堆内存的当前内存使用量"+mem.getNonHeapMemoryUsage()); // Java 虚拟机的编译系统的管理接口 CompilationMXBean CompilationMXBean com=(CompilationMXBean)ManagementFactory.getCompilationMXBean(); System.out.println("即时 (JIT) 编译器的名称"+com.getName()); System.out.println("在编译上花费的累积耗费时间的近似值(毫秒)"+com.getTotalCompilationTime()); //Java 虚拟机的类加载系统的管理接口 ClassLoadingMXBean ClassLoadingMXBean cl=(ClassLoadingMXBean)ManagementFactory.getClassLoadingMXBean(); System.out.println("当前加载到 Java 虚拟机中的类的数量"+cl.getLoadedClassCount()); System.out.println("Java 虚拟机开始执行到目前已经加载的类的总数"+cl.getTotalLoadedClassCount()); System.out.println("Java 虚拟机开始执行到目前已经卸载的类的总数"+cl.getUnloadedClassCount()); } }