JVM本身提供了一组管理的API,通过API,我们可以获得到JVM内部主要运行信息等等。各种JDK自带的剖析工具,包括jps、jstack、jinfo、jstat、jmap、jconsole等,都是基于此API开发的。
1. HotSpotDiagnostic
非标准的监控JMS,这块是Sun JVM自带的,主要提供了两个功能
- 修改JVM的启动参数。
- Dump堆信息到文件。
2.ClassLoading
加载的类的总体信息,我们可以通过此MBean获取到JVM加载的类定义的总体信息。
3.Compliation
提供JVM的JIT(Just In Time)编译器(将bytecode编译成native code)的信息。
4.GarbageCollector
垃圾回收器信息。
5.内存相关
(1)Memory/MemoryManager
内存块相关信息。
(2)MemoryPool
6.系统运行信息
(1)OperatingSystem
操作系统上的一些信息。
(2)Runtime
获取JVM一些相关信息。
7.Threading
可以通过此MBean获取线程信息,包括线程状态、执行栈等。
编程获取到JVM Manage信息
有3种方式
(1)监控应用与被监控应用位于同一JVM
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(server,
"java.lang:type=Runtime", RuntimeMXBean.class);
(2)监控应用与被监控应用位于不同JVM
- 首先在被监控的JVM的启动参数中加入如下启动参数以启JVM代理
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=127.0.0.1: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 = ManagementFactory.newPlatformMXBeanProxy(connector
.getMBeanServerConnection(),"java.lang:type=Runtime",
RuntimeMXBean.class);
(3)监控应用与被监控应用不位于同一JVM但在同一物理主机上
通过Attach到被监控的JVM进程,并在被监控的JVM中启动一个JMX代理,然后使用代理通过2的方式连接到被监控的JVM的JMS上。
/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 = ManagementFactory.newPlatformMXBeanProxy(connector
.getMBeanServerConnection(), "java.lang:type=Runtime",RuntimeMXBean.class);