`
snoopy7713
  • 浏览: 1152761 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

java不用jni,也可以获得当前系统性能信息

阅读更多

最近做个项目,就是要取得cpu占有率等等的系统信息,一开始以为要用动态链接库了,但后来发现可以像下面这样做,不去调用jni,这样省去了很多看新技术的时间o(∩_∩)o...

在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物理内存等信息,下面例子可以取得这些信息,并且获得在Windows下的内存使用率。
     首先编写一个MonitorInfoBean类,用来装载监控的一些信息,包括物理内存、剩余的物理内存、已使用的物理内存、内存使用率等字段,该类的代码如下:

Java代码  收藏代码
  1. package  com.amgkaka.performance;  
  2.   
  3. /** */ /**  
  4.  * 监视信息的JavaBean类.  
  5.  * @author  amg  
  6.  * @version 1.0   
  7.  * Creation date: 2008-4-25 - 上午10:37:00  
  8.  */   
  9. public   class  MonitorInfoBean {  
  10.     /** */ /** 可使用内存. */   
  11.     private   long  totalMemory;  
  12.       
  13.     /** */ /** 剩余内存. */   
  14.     private   long  freeMemory;  
  15.       
  16.     /** */ /** 最大可使用内存. */   
  17.     private   long  maxMemory;  
  18.       
  19.     /** */ /** 操作系统. */   
  20.     private  String osName;  
  21.       
  22.     /** */ /** 总的物理内存. */   
  23.     private   long  totalMemorySize;  
  24.       
  25.     /** */ /** 剩余的物理内存. */   
  26.     private   long  freePhysicalMemorySize;  
  27.       
  28.     /** */ /** 已使用的物理内存. */   
  29.     private   long  usedMemory;  
  30.       
  31.     /** */ /** 线程总数. */   
  32.     private   int  totalThread;  
  33.       
  34.     /** */ /** cpu使用率. */   
  35.     private   double  cpuRatio;  
  36.   
  37.     public   long  getFreeMemory() {  
  38.         return  freeMemory;  
  39.     }  
  40.   
  41.     public   void  setFreeMemory( long  freeMemory) {  
  42.         this .freeMemory = freeMemory;  
  43.     }  
  44.   
  45.     public   long  getFreePhysicalMemorySize() {  
  46.         return  freePhysicalMemorySize;  
  47.     }  
  48.   
  49.     public   void  setFreePhysicalMemorySize( long  freePhysicalMemorySize) {  
  50.         this .freePhysicalMemorySize = freePhysicalMemorySize;  
  51.     }  
  52.   
  53.     public   long  getMaxMemory() {  
  54.         return  maxMemory;  
  55.     }  
  56.   
  57.     public   void  setMaxMemory( long  maxMemory) {  
  58.         this .maxMemory = maxMemory;  
  59.     }  
  60.   
  61.     public  String getOsName() {  
  62.         return  osName;  
  63.     }  
  64.   
  65.     public   void  setOsName(String osName) {  
  66.         this .osName = osName;  
  67.     }  
  68.   
  69.     public   long  getTotalMemory() {  
  70.         return  totalMemory;  
  71.     }  
  72.   
  73.     public   void  setTotalMemory( long  totalMemory) {  
  74.         this .totalMemory = totalMemory;  
  75.     }  
  76.   
  77.     public   long  getTotalMemorySize() {  
  78.         return  totalMemorySize;  
  79.     }  
  80.   
  81.     public   void  setTotalMemorySize( long  totalMemorySize) {  
  82.         this .totalMemorySize = totalMemorySize;  
  83.     }  
  84.   
  85.     public   int  getTotalThread() {  
  86.         return  totalThread;  
  87.     }  
  88.   
  89.     public   void  setTotalThread( int  totalThread) {  
  90.         this .totalThread = totalThread;  
  91.     }  
  92.   
  93.     public   long  getUsedMemory() {  
  94.         return  usedMemory;  
  95.     }  
  96.   
  97.     public   void  setUsedMemory( long  usedMemory) {  
  98.         this .usedMemory = usedMemory;  
  99.     }  
  100.   
  101.     public   double  getCpuRatio() {  
  102.         return  cpuRatio;  
  103.     }  
  104.   
  105.     public   void  setCpuRatio( double  cpuRatio) {  
  106.         this .cpuRatio = cpuRatio;  
  107.     }  
  108. }  

 

接着编写一个获得当前的监控信息的接口,该类的代码如下所示:

Java代码  收藏代码
  1. package  com.amgkaka.performance;  
  2.   
  3. /** */ /**  
  4.  * 获取系统信息的业务逻辑类接口.  
  5.  * @author amg * @version 1.0   
  6.  * Creation date: 2008-3-11 - 上午10:06:06  
  7.  */   
  8. public   interface  IMonitorService {  
  9.     /** */ /**  
  10.      * 获得当前的监控对象.  
  11.      * @return 返回构造好的监控对象  
  12.      * @throws Exception  
  13.      * @author amgkaka  
  14.      * Creation date: 2008-4-25 - 上午10:45:08  
  15.      */   
  16.     public  MonitorInfoBean getMonitorInfoBean()  throws  Exception;  
  17.   
  18. }  

  该类的实现类MonitorServiceImpl如下所示:

Java代码  收藏代码
  1. package  com.amgkaka.performance;  
  2.   
  3. import  java.io.InputStreamReader;  
  4. import  java.io.LineNumberReader;  
  5.   
  6. import  sun.management.ManagementFactory;  
  7.   
  8. import  com.sun.management.OperatingSystemMXBean;  
  9.   
  10. /** */ /**  
  11.  * 获取系统信息的业务逻辑实现类.  
  12.  * @author amg * @version 1.0 Creation date: 2008-3-11 - 上午10:06:06  
  13.  */   
  14. public   class  MonitorServiceImpl  implements  IMonitorService {  
  15.     //可以设置长些,防止读到运行此次系统检查时的cpu占用率,就不准了   
  16.     private   static   final   int  CPUTIME =  5000 ;  
  17.   
  18.     private   static   final   int  PERCENT =  100 ;  
  19.   
  20.     private   static   final   int  FAULTLENGTH =  10 ;  
  21.   
  22.     /** */ /**  
  23.      * 获得当前的监控对象.  
  24.      * @return 返回构造好的监控对象  
  25.      * @throws Exception  
  26.      * @author amg     * Creation date: 2008-4-25 - 上午10:45:08  
  27.      */   
  28.     public  MonitorInfoBean getMonitorInfoBean()  throws  Exception {  
  29.         int  kb =  1024 ;  
  30.           
  31.         // 可使用内存   
  32.         long  totalMemory = Runtime.getRuntime().totalMemory() / kb;  
  33.         // 剩余内存   
  34.         long  freeMemory = Runtime.getRuntime().freeMemory() / kb;  
  35.         // 最大可使用内存   
  36.         long  maxMemory = Runtime.getRuntime().maxMemory() / kb;  
  37.   
  38.         OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory  
  39.                 .getOperatingSystemMXBean();  
  40.   
  41.         // 操作系统   
  42.         String osName = System.getProperty("os.name" );  
  43.         // 总的物理内存   
  44.         long  totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;  
  45.         // 剩余的物理内存   
  46.         long  freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;  
  47.         // 已使用的物理内存   
  48.         long  usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb  
  49.                 .getFreePhysicalMemorySize())  
  50.                 / kb;  
  51.   
  52.         // 获得线程总数   
  53.         ThreadGroup parentThread;  
  54.         for  (parentThread = Thread.currentThread().getThreadGroup(); parentThread  
  55.                 .getParent() != null ; parentThread = parentThread.getParent())  
  56.             ;  
  57.         int  totalThread = parentThread.activeCount();  
  58.   
  59.         double  cpuRatio =  0 ;  
  60.         if  (osName.toLowerCase().startsWith( "windows" )) {  
  61.             cpuRatio = this .getCpuRatioForWindows();  
  62.         }  
  63.           
  64.         // 构造返回对象   
  65.         MonitorInfoBean infoBean = new  MonitorInfoBean();  
  66.         infoBean.setFreeMemory(freeMemory);  
  67.         infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);  
  68.         infoBean.setMaxMemory(maxMemory);  
  69.         infoBean.setOsName(osName);  
  70.         infoBean.setTotalMemory(totalMemory);  
  71.         infoBean.setTotalMemorySize(totalMemorySize);  
  72.         infoBean.setTotalThread(totalThread);  
  73.         infoBean.setUsedMemory(usedMemory);  
  74.         infoBean.setCpuRatio(cpuRatio);  
  75.         return  infoBean;  
  76.     }  
  77.   
  78.     /** */ /**  
  79.      * 获得CPU使用率.  
  80.      * @return 返回cpu使用率  
  81.      * @author amg     * Creation date: 2008-4-25 - 下午06:05:11  
  82.      */   
  83.     private   double  getCpuRatioForWindows() {  
  84.         try  {  
  85.             String procCmd = System.getenv("windir" )  
  86.                     + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,"   
  87.                     + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount" ;  
  88.             // 取进程信息   
  89.             long [] c0 = readCpu(Runtime.getRuntime().exec(procCmd));  
  90.             Thread.sleep(CPUTIME);  
  91.             long [] c1 = readCpu(Runtime.getRuntime().exec(procCmd));  
  92.             if  (c0 !=  null  && c1 !=  null ) {  
  93.                 long  idletime = c1[ 0 ] - c0[ 0 ];  
  94.                 long  busytime = c1[ 1 ] - c0[ 1 ];  
  95.                 return  Double.valueOf(  
  96.                         PERCENT * (busytime) / (busytime + idletime))  
  97.                         .doubleValue();  
  98.             } else  {  
  99.                 return   0.0 ;  
  100.             }  
  101.         } catch  (Exception ex) {  
  102.             ex.printStackTrace();  
  103.             return   0.0 ;  
  104.         }  
  105.     }  
  106.   
  107.     /** */ /**  
  108.      * 读取CPU信息.  
  109.      * @param proc  
  110.      * @return  
  111.      * @author amg     * Creation date: 2008-4-25 - 下午06:10:14  
  112.      */   
  113.     private   long [] readCpu( final  Process proc) {  
  114.         long [] retn =  new   long [ 2 ];  
  115.         try  {  
  116.             proc.getOutputStream().close();  
  117.             InputStreamReader ir = new  InputStreamReader(proc.getInputStream());  
  118.             LineNumberReader input = new  LineNumberReader(ir);  
  119.             String line = input.readLine();  
  120.             if  (line ==  null  || line.length() < FAULTLENGTH) {  
  121.                 return   null ;  
  122.             }  
  123.             int  capidx = line.indexOf( "Caption" );  
  124.             int  cmdidx = line.indexOf( "CommandLine" );  
  125.             int  rocidx = line.indexOf( "ReadOperationCount" );  
  126.             int  umtidx = line.indexOf( "UserModeTime" );  
  127.             int  kmtidx = line.indexOf( "KernelModeTime" );  
  128.             int  wocidx = line.indexOf( "WriteOperationCount" );  
  129.             long  idletime =  0 ;  
  130.             long  kneltime =  0 ;  
  131.             long  usertime =  0 ;  
  132.             while  ((line = input.readLine()) !=  null ) {  
  133.                 if  (line.length() < wocidx) {  
  134.                     continue ;  
  135.                 }  
  136.                 // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount,   
  137.                 // ThreadCount,UserModeTime,WriteOperation   
  138.                 String caption = Bytes.substring(line, capidx, cmdidx - 1 )  
  139.                         .trim();  
  140.                 String cmd = Bytes.substring(line, cmdidx, kmtidx - 1 ).trim();  
  141.                 if  (cmd.indexOf( "wmic.exe" ) >=  0 ) {  
  142.                     continue ;  
  143.                 }  
  144.                 // log.info("line="+line);   
  145.                 if  (caption.equals( "System Idle Process" )  
  146.                         || caption.equals("System" )) {  
  147.                     idletime += Long.valueOf(  
  148.                             Bytes.substring(line, kmtidx, rocidx - 1 ).trim())  
  149.                             .longValue();  
  150.                     idletime += Long.valueOf(  
  151.                             Bytes.substring(line, umtidx, wocidx - 1 ).trim())  
  152.                             .longValue();  
  153.                     continue ;  
  154.                 }  
  155.   
  156.                 kneltime += Long.valueOf(  
  157.                         Bytes.substring(line, kmtidx, rocidx - 1 ).trim())  
  158.                         .longValue();  
  159.                 usertime += Long.valueOf(  
  160.                         Bytes.substring(line, umtidx, wocidx - 1 ).trim())  
  161.                         .longValue();  
  162.             }  
  163.             retn[0 ] = idletime;  
  164.             retn[1 ] = kneltime + usertime;  
  165.             return  retn;  
  166.         } catch  (Exception ex) {  
  167.             ex.printStackTrace();  
  168.         } finally  {  
  169.             try  {  
  170.                 proc.getInputStream().close();  
  171.             } catch  (Exception e) {  
  172.                 e.printStackTrace();  
  173.             }  
  174.         }  
  175.         return   null ;  
  176.     }  
  177.       
  178.     /** */ /**  
  179.      * 测试方法.  
  180.      * @param args  
  181.      * @throws Exception  
  182.      * @author amg     * Creation date: 2008-4-30 - 下午04:47:29  
  183.      */   
  184.     public   static   void  main(String[] args)  throws  Exception {  
  185.         IMonitorService service = new  MonitorServiceImpl();  
  186.         MonitorInfoBean monitorInfo = service.getMonitorInfoBean();  
  187.         System.out.println("cpu占有率="  + monitorInfo.getCpuRatio());  
  188.           
  189.         System.out.println("可使用内存="  + monitorInfo.getTotalMemory());  
  190.         System.out.println("剩余内存="  + monitorInfo.getFreeMemory());  
  191.         System.out.println("最大可使用内存="  + monitorInfo.getMaxMemory());  
  192.           
  193.         System.out.println("操作系统="  + monitorInfo.getOsName());  
  194.         System.out.println("总的物理内存="  + monitorInfo.getTotalMemorySize() +  "kb" );  
  195.         System.out.println("剩余的物理内存="  + monitorInfo.getFreeMemory() +  "kb" );  
  196.         System.out.println("已使用的物理内存="  + monitorInfo.getUsedMemory() +  "kb" );  
  197.         System.out.println("线程总数="  + monitorInfo.getTotalThread() +  "kb" );  
  198.     }  
  199. }  

 

该实现类中需要用到一个自己编写byte的工具类,该类的代码如下所示:

Java代码  收藏代码
  1. package  com.amgkaka.performance;  
  2.   
  3. /** */ /**  
  4.  * byte操作类.  
  5.  * @author amg * @version 1.0   
  6.  * Creation date: 2008-4-30 - 下午04:57:23  
  7.  */   
  8. public   class  Bytes {  
  9.     /** */ /**  
  10.      * 由于String.subString对汉字处理存在问题(把一个汉字视为一个字节),因此在  
  11.      * 包含汉字的字符串时存在隐患,现调整如下:  
  12.      * @param src 要截取的字符串  
  13.      * @param start_idx 开始坐标(包括该坐标)  
  14.      * @param end_idx   截止坐标(包括该坐标)  
  15.      * @return  
  16.      */   
  17.     public   static  String substring(String src,  int  start_idx,  int  end_idx){  
  18.         byte [] b = src.getBytes();  
  19.         String tgt = "" ;  
  20.         for ( int  i=start_idx; i<=end_idx; i++){  
  21.             tgt +=(char )b[i];  
  22.         }  
  23.         return  tgt;  
  24.     }  
  25. }  

 

运行下MonitorBeanImpl类,读者将会看到当前的内存、cpu利用率等信息。

分享到:
评论

相关推荐

    Java_JNI_获得系统进程信息实例.doc

    在《Java_JNI_获得系统进程信息实例.doc》中,我们探索了一个利用Java Native Interface (JNI)来获取操作系统进程信息的示例项目。该项目由三个主要部分组成:`systemProcess.java`,`dataProcess.java`以及`process...

    java-JNI调用动态库获取硬件信息制作软件加密

    JNI最常用于实现Java环境下的底层功能访问,特别是那些需要高性能或者依赖特定操作系统或硬件的功能。通过JNI,开发者可以编写Java应用程序来调用本地方法,这些本地方法通常是用C或C++编写的,并被编译成动态链接库...

    java使用jni技术对硬件平台的资源进行监控

    在 Java 中,JNI 可以帮助我们获取操作系统级别的内存信息,例如总内存、已用内存和空闲内存。在 Windows 上,可以使用 `GlobalMemoryStatusEx` 函数;在 Unix 系统中,可以读取 `/proc/meminfo` 文件。 4. **网卡...

    JNI处理各种类型数据,不包含获取Java的HashMap

    6. 异常处理:在JNI中,使用`ExceptionOccurred`检查是否发生了异常,如果有,可以用`ExceptionDescribe`打印异常信息,`ExceptionClear`清除当前的异常。 7. 类和方法ID:在C/C++中,你需要先获取类的`jclass`,...

    java(jni)获得CPU、内存使用率 绝对可用

    为了实现这一目标,我们可以利用JNI(Java Native Interface),它提供了一种方式让Java代码能够调用C/C++编写的本地方法,从而获取系统底层的信息。本文将详细讲解如何通过JNI在Java中获取CPU和内存的使用率。 ...

    java的JNI本地调用

    ### Java的JNI本地调用详解 #### 一、简述JNI技术 ...虽然使用JNI可以带来诸多好处,但也需注意它可能导致的问题,比如增加代码复杂度、降低程序的可移植性等。因此,在实际开发中应根据需求权衡是否使用JNI。

    JNI系统进程列表查询

    JNI提供了一种方式,让Java代码可以调用C/C++编写的本地方法,同时也允许C/C++代码调用Java对象的方法。通过定义`native`关键字的函数,Java类可以在运行时通过`System.loadLibrary()`加载对应的本地库,从而实现跨...

    jni中用多线程调用java代码

    在Android开发中,JNI常用于提升性能、调用系统库或者实现特定功能,如与C/C++库交互。本项目重点在于如何在JNI中利用多线程调用Java代码,这在处理大量数据或者并发任务时非常有用。 首先,理解JNI的基本概念至关...

    java的jni方式调用C++封装的库文件

    通过JNI,开发者可以在Java应用程序中利用已有的C++库,提升性能或实现Java无法直接处理的功能。 【配置JNI开发环境】 1. **安装JDK**:首先确保安装了Java Development Kit(JDK),推荐使用1.5及以上版本。安装...

    jni.rar_JNI编程_java jni_jni_site:www.pudn.com

    本地代码可以通过`ExceptionOccurred`检查是否有Java异常发生,使用`ExceptionDescribe`打印异常信息,`ExceptionClear`清除当前的异常。 8. **线程支持** JNI支持多线程编程,每个Java线程都有一个对应的本地线程...

    Java获取系统CPU、内存、硬盘等系统信息

    在Java编程中,获取系统资源的信息是常见...总的来说,Java虽然不能直接提供获取所有系统资源的通用方法,但通过标准库和其他辅助工具,我们可以获取到CPU、内存和硬盘等关键信息,为系统监控和性能优化提供数据支持。

    获取当前系统所有进程

    总结来说,获取当前系统所有进程可以通过Java直接调用操作系统命令或者使用JNI调用本地代码实现。前者简单且跨平台,但可能受到操作系统命令行工具的限制;后者更灵活,可以直接操作底层系统,但需要编写和管理本地...

    java读取服务器硬件信息(windowx+linux+Mac OS)

    这些信息可以通过Runtime类的exec方法执行,并通过BufferedReader读取输出流。 在Mac OS环境中,Java可以利用OS X提供的命令行工具,如`sysctl`和`system_profiler`。`sysctl`命令可以获取内核和硬件参数,而`...

    有关java jni详解

    它不仅能够帮助开发者整合现有的C/C++代码库,还能让Java应用与本地系统更好地交互,从而获得更好的性能或者访问特定硬件资源的能力。 #### 二、JNI的应用场景 JNI的应用场景非常广泛,主要可以分为以下几个方面:...

    Android JNI 知识简介(Java Native Interface )

    在这个例子中,`JNI_OnLoad()`函数首先获取当前的JNIEnv指针,并检查是否支持所需的JNI版本(这里假设是1.4版本)。然后,它会注册多个Java native方法,确保这些方法能够在Java层被正确调用。如果注册过程中出现...

    java-读取任务管理器信息

    "Java 读取任务管理器信息" 本文主要讨论了如何在 Java 中读取任务管理器信息,包括物理内存、剩余物理内存、已使用...java 中读取任务管理器信息可以帮助开发者更好地了解系统的当前状态,提高系统的性能和可维护性。

    jni入门demo。java调c,c调java

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和...通过JNI,我们可以轻松地集成现有C/C++库,实现高性能计算,或者访问特定操作系统的功能。理解并熟练使用JNI是任何Java开发者的宝贵技能。

    安卓串口Socket通讯USB驱动jni相关-Android获取手机sim卡信息包含手机平台运营商等信息.rar

    这些方法返回的信息可以帮助我们了解设备当前连接的运营商和网络环境。 接下来,关于JNI,它是Java平台用来与C/C++原生代码交互的一种机制。在某些情况下,为了提高性能或者利用硬件特性,开发者可能需要编写原生...

Global site tag (gtag.js) - Google Analytics