现在的位置: 首页 > 综合 > 正文

Jvm检测api

2019年05月22日 ⁄ 综合 ⁄ 共 4519字 ⁄ 字号 评论关闭

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());
        
        
    }

}
【上篇】
【下篇】

抱歉!评论已关闭.