`
songzi0206
  • 浏览: 159224 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
Group-logo
All are from ...
浏览量:33877
Group-logo
Programming w...
浏览量:19750
社区版块
存档分类
最新评论

利用JMX统计远程JAVA进程的CPU和Memory

    博客分类:
  • JMX
 
阅读更多

      从JAVA 5开始,JDK提供了一些JVM检测的API,这就是有名的java.lang.management 包,包里提供了许多MXBean的接口类,可以很方便的获取到JVM的内存、GC、线程、锁、class、甚至操作系统层面的各种信息,本文就简单的介绍一种利用JMX对JAVA进程进行CPU、堆内存使用的监控。可能有人会觉得没必要这样做,因为用jconsole之类的工具都能做到,而且会比本文的例子更详细。但是有些时候将console不一定能监控到作为系统服务的java进程,我最近就不得不自己编码去获取远程java进程的监控数据。希望能起到抛砖引玉的作用吧。

      首先,简要介绍下JMX(Java Management Extensions),即JAVA管理扩展,用来监视和管理JVM以及其运行的操作系统。目前java平台主要提供了下图所示的9个MXBean, 各个MXBean的作用根据类名大概能猜出几分,具体可查API。


        java.lang.management包中的mxbean提供了基本的功能,在sum.com.management中对某些功能有所增强,当然我们也可以根据JMX规范提供自己的MXBean。

 

       下面我主要使用java.lang.management.MemoryMXBean和sun.com.management.OperatingSystemMXBean分别对远程JAVA进行内存和cpu的监控。根据需求5秒钟读取一次数据,内存主要是已使用的Heap Memory,CPU主要就是使用率了。

 

       在使用OperatingSystemMXBean以及MemoryMXBean之前,首先必须得到JMXConnector并创建MBeanServerConnnection,有了这个connection我们就可以利用ManagementFactory创建需要的MXBean了,类依赖图如下:



        示例代码:

/*
* host: 远程机器的ip地址
* port: 远程java进程运行的jmxremote端口
*/
JMXServiceURL serviceURL = new JMXServiceURL( host,port );
JMXConnector conn = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection mbs=conn.getMBeanServerConnection();

//获取远程memorymxbean
MemoryMXBean memBean=ManagementFactory.newPlatformMXBeanProxy
(mbs,ManagementFactory.MEMORY_MXBEAN_NAME, MemoryMXBean.class);
//获取远程opretingsystemmxbean
com.sun.management.OperatingSystemMXBean opMXbean = 
ManagementFactory.newPlatformMXBeanProxy(mbs,				
ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);

 

       然后,采集memory的数据就比较简单了,直接调用API获取:

		/**    Collect data every 5 seconds		 */
		try {
			TimeUnit.SECONDS.sleep(5);
		} catch (InterruptedException e) {
			logger.error("InterruptedException occurred while MemoryCollector sleeping...");
		}
		
		MemoryUsage heap = memBean
.getHeapMemoryUsage();
		MemoryUsage nonHeap = memBean
.getNonHeapMemoryUsage();
		long heapSizeUsed = heap.getUsed();//堆使用的大小
		long nonHeapSizeUsed = nonHeap.getUsed();
		long heapCommitedSize = heap.getCommitted();
		long nonHeapCommitedSize = nonHeap.getCommitted();
						

      采集CPU利用率需要自己计算一下,因为API只提供了获取cpu的使用时间,我得在两次系统时间间隔内获取两次CPU的使用时间,得到在该时间间隔内cpu使用的时间,相除即得到CPU的使用率,当然误差肯定存在。

        Long start = System.currentTimeMillis();
        long startT = opMXbean.getProcessCpuTime();
        /**    Collect data every 5 seconds		 */
		try {
			TimeUnit.SECONDS.sleep(5);
		} catch (InterruptedException e) {
			logger.error("InterruptedException occurred while MemoryCollector sleeping...");
		}
        Long end = System.currentTimeMillis();
        long endT = opMXbean.getProcessCpuTime();
//end - start 即为当前采集的时间单元,单位ms
//endT - startT 为当前时间单元内cpu使用的时间,单位为ns
//所以:double ratio = (entT-startT)/1000000.0/(end-start)/opMXbean.getAvailableProcessors()
 

      核心代码就是这些了,当然,具体使用的话应该用单独的线程分别取cpu、memory数据,读取的数据需要写文件或者画图,监控时间长的话还要定时的将这些数据刷到磁盘文件或数据库中,等,这些都是题外话了。这边我写到excel中,然后在excel中图形展示,远程监控的程序不方便展示,仅仅来监控一段模拟cpu正弦曲线的程序 ,来看看我监控到的数据(图形)是否和预期一致,并与jconsole采到的有何差异:

public class SinCpu {

    public static final double TIME = 1000;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws InterruptedException {
            new Thread(new SinTask()).start();
    }

    
    
   static class SinTask implements Runnable{

        @Override
        public void run() {
            double x = 0;
            double y = 0;

            while (true) {
                y = (Math.sin(x) + 1) * TIME / 2;
                doSomeSimpleWork(y);
                x += 0.1;
                try {
                    Thread.sleep((long) (TIME - y));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        private void doSomeSimpleWork(double y) {
            long startTime = System.currentTimeMillis();
            while ((System.currentTimeMillis() - startTime) < y) {
            }
        }
    }
}

 

       监控结果基本和预期一样,CPU数据图呈现预期的正弦曲线:


        上图中,第一个图是从jconsole监控图中截过来的,而下图是我利用opMXBean计算获得,两个图基本吻合,数据基本波动在0-25%是因为我测试机器是四核的cpu,两个图像之间有位移是因为,我手动打开jconsole没有我程序监控来的快,所以大概图像平移下基本吻合。

        内存的测试应该比CPU还要准一些,这里就不贴了。Note: 如果监控的程序线程数量很大,cpu会有较明显误差,而且采的频率不够高的话可能有些点漏采。

 

最后:被测程序必须开放JMXREMOTE端口,具体使用参数:

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=[开放的端口]
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

 

  • 大小: 58.9 KB
  • 大小: 47.7 KB
  • 大小: 92.1 KB
分享到:
评论

相关推荐

    java读取CPU内存信息

    这个程序每隔一秒钟会输出一次内存和线程的统计信息,但请注意,由于CPU利用率的计算涉及到时间间隔,所以需要对获取CPU时间的部分做适当修改,以获取一段时间内的变化,从而计算出CPU利用率。 在项目中,我们可以...

    AIX.zip_aix

    然后,Java程序可以通过JMX客户端连接到运行在AIX上的JMX服务,远程收集CPU和内存数据。 2. **直接调用操作系统接口**:Java程序还可以通过JNI(Java Native Interface)直接与AIX的系统调用交互。例如,可以使用`/...

    JAVA性能分析

    3. **配置远程连接**: 在服务器上的Tomcat的bin目录下的`catalina.sh`文件中追加以下内容以启用JMX远程连接功能: ```sh CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=&lt;服务器IP&gt; -Dcom.sun....

    Java诊断工具源代码.zip

    1. **JVM内置工具**:Java虚拟机(JVM)提供了多种内置的诊断工具,如`jps`(Java进程状态工具)、`jstat`(Java统计监视工具)、`jinfo`(配置信息工具)、`jmap`(映射工具)、`jhat`(堆分析工具)和`jstack`...

    ibm查看Java内存工具.zip

    然后,可以通过这些工具的界面或API连接到你的Java进程,获取内存使用报告。 在分析内存问题时,重点关注以下几个方面: 1. **内存泄漏**:检查长期存在的对象,看是否有不再使用的对象占用大量内存。 2. **内存...

    jconsole+tomcat配置说明 附加Tomcat内存说明(基于jdk5.0).docx )

    例如,Unix/Linux系统下使用`ps`命令查找Java进程的PID,Windows系统则可以通过任务管理器或`jps`命令获取。连接命令格式为`jconsole [PID]`。 3. **远程监控**: 若要远程监控Java应用,需要知道目标主机的IP地址或...

    Java工程师应用技术汇总

    - **jps**:显示当前运行的所有Java进程的信息。 - **jstack**:获取指定进程的线程堆栈信息。 - **jmap**:生成内存映像文件,用于分析内存使用情况。 - **jconsole**:图形界面工具,监控和管理本地或远程的应用...

    Java问题定位技术的文档

    此外,通过JDK的`jstack`工具,我们还可以实时获取Java进程的堆栈信息,帮助分析线程阻塞等问题。 性能问题定位通常需要借助于监控工具。JVisualVM(JDK自带)和VisualVM是常用的Java性能分析工具,它们能提供内存...

    监控jvm资源利用,查看应用程序的资源占用情况

    2. **连接目标应用**:启动VisualVM,选择“Local”或“Remote”,然后找到你要监控的Java进程。 3. **数据分析**:根据需要选择不同的视图,如“Threads”、“Memory”或“Profiler”,观察资源使用情况。 4. **...

    可视化性能监控工具VisualVM

    2. **连接远程JVM**:如果需要监控远程Java应用,需要在目标机器上配置JDK的`jvm.options`文件,开启远程监控端口,然后在VisualVM中添加远程主机。 3. **选择分析模块**:根据需求选择合适的分析模块,例如选择...

    Jprofile资源监控WebLogic部署项目占用资源的大小步骤---操作步骤,图片

    6、**选择监控内容**:在“Attach to Process”对话框中,JProfiler会列出WebLogic服务器上运行的所有Java进程。找到对应WebLogic部署的Java进程,这通常是与你的应用程序相关的进程。 7、**配置WebLogic启动脚本**...

    VisualVM程序性能分析工具 v2.1.7.zip

    然后,可以通过"File"菜单添加要监控的Java进程,或者使用"jvisualvm"命令行工具来启动VisualVM并与目标应用进行连接。 6. **与其他工具的集成**: VisualVM支持插件扩展,可以与JProfiler、YourKit等其他性能分析...

    Jconsole JDK自带的监控程序

    2. **Memory Tab**:显示JVM内存的使用情况,包括堆内存(Heap Memory)和非堆内存(Non-Heap Memory)的详细信息。堆内存细分为新生代(Young Generation)和老年代(Old Generation),每个区域的使用量、最大容量...

    JProfiler9入门教程

    - 创建监视远程Java程序的工程:步骤与上述类似,主要区别在于需要指定具体的Java程序而不是Tomcat服务器。 3. **离线模式(Offline Mode)**:离线模式允许用户分析之前收集的数据文件,而不是实时监控应用程序。...

Global site tag (gtag.js) - Google Analytics