国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

使用Java代碼獲取服務器性能信息及局域網內主機名

2019-11-26 14:50:48
字體:
來源:轉載
供稿:網友

最近做個項目,就是要取得cpu占有率等等的系統信息,一開始以為要用動態鏈接庫了,但后來發現可以像下面這樣做,不去調用jni,這樣省去了很多看新技術的時間o(∩_∩)o...
在Java中,可以獲得總的物理內存、剩余的物理內存、已使用的物理內存等信息,下面例子可以取得這些信息,并且獲得在Windows下的內存使用率。
     首先編寫一個MonitorInfoBean類,用來裝載監控的一些信息,包括物理內存、剩余的物理內存、已使用的物理內存、內存使用率等字段,該類的代碼如下:

package com.amgkaka.performance;  /** */ /**  * 監視信息的JavaBean類.  * @author amg  * @version 1.0   * Creation date: 2008-4-25 - 上午10:37:00  */  public  class MonitorInfoBean {   /** */ /** 可使用內存. */    private  long totalMemory;      /** */ /** 剩余內存. */    private  long freeMemory;      /** */ /** 最大可使用內存. */    private  long maxMemory;      /** */ /** 操作系統. */    private String osName;      /** */ /** 總的物理內存. */    private  long totalMemorySize;      /** */ /** 剩余的物理內存. */    private  long freePhysicalMemorySize;      /** */ /** 已使用的物理內存. */    private  long usedMemory;      /** */ /** 線程總數. */    private  int totalThread;      /** */ /** cpu使用率. */    private  double cpuRatio;    public  long getFreeMemory() {     return freeMemory;   }    public  void setFreeMemory( long freeMemory) {     this .freeMemory = freeMemory;   }    public  long getFreePhysicalMemorySize() {     return freePhysicalMemorySize;   }    public  void setFreePhysicalMemorySize( long freePhysicalMemorySize) {     this .freePhysicalMemorySize = freePhysicalMemorySize;   }    public  long getMaxMemory() {     return maxMemory;   }    public  void setMaxMemory( long maxMemory) {     this .maxMemory = maxMemory;   }    public String getOsName() {     return osName;   }    public  void setOsName(String osName) {     this .osName = osName;   }    public  long getTotalMemory() {     return totalMemory;   }    public  void setTotalMemory( long totalMemory) {     this .totalMemory = totalMemory;   }    public  long getTotalMemorySize() {     return totalMemorySize;   }    public  void setTotalMemorySize( long totalMemorySize) {     this .totalMemorySize = totalMemorySize;   }    public  int getTotalThread() {     return totalThread;   }    public  void setTotalThread( int totalThread) {     this .totalThread = totalThread;   }    public  long getUsedMemory() {     return usedMemory;   }    public  void setUsedMemory( long usedMemory) {     this .usedMemory = usedMemory;   }    public  double getCpuRatio() {     return cpuRatio;   }    public  void setCpuRatio( double cpuRatio) {     this .cpuRatio = cpuRatio;   } } 

 
接著編寫一個獲得當前的監控信息的接口,該類的代碼如下所示:

package com.amgkaka.performance;  /** */ /**  * 獲取系統信息的業務邏輯類接口.  * @author amg * @version 1.0   * Creation date: 2008-3-11 - 上午10:06:06  */  public  interface IMonitorService {   /** */ /**    * 獲得當前的監控對象.    * @return 返回構造好的監控對象    * @throws Exception    * @author amgkaka    * Creation date: 2008-4-25 - 上午10:45:08    */    public MonitorInfoBean getMonitorInfoBean() throws Exception;  } 

  該類的實現類MonitorServiceImpl如下所示:

package com.amgkaka.performance;  import java.io.InputStreamReader; import java.io.LineNumberReader;  import sun.management.ManagementFactory;  import com.sun.management.OperatingSystemMXBean;  /** */ /**  * 獲取系統信息的業務邏輯實現類.  * @author amg * @version 1.0 Creation date: 2008-3-11 - 上午10:06:06  */  public  class MonitorServiceImpl implements IMonitorService {   //可以設置長些,防止讀到運行此次系統檢查時的cpu占用率,就不準了    private  static  final  int CPUTIME = 5000 ;    private  static  final  int PERCENT = 100 ;    private  static  final  int FAULTLENGTH = 10 ;    /** */ /**    * 獲得當前的監控對象.    * @return 返回構造好的監控對象    * @throws Exception    * @author amg   * Creation date: 2008-4-25 - 上午10:45:08    */    public MonitorInfoBean getMonitorInfoBean() throws Exception {     int kb = 1024 ;          // 可使用內存      long totalMemory = Runtime.getRuntime().totalMemory() / kb;     // 剩余內存      long freeMemory = Runtime.getRuntime().freeMemory() / kb;     // 最大可使用內存      long maxMemory = Runtime.getRuntime().maxMemory() / kb;      OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory         .getOperatingSystemMXBean();      // 操作系統      String osName = System.getProperty("os.name" );     // 總的物理內存      long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;     // 剩余的物理內存      long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;     // 已使用的物理內存      long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb         .getFreePhysicalMemorySize())         / kb;      // 獲得線程總數      ThreadGroup parentThread;     for (parentThread = Thread.currentThread().getThreadGroup(); parentThread         .getParent() != null ; parentThread = parentThread.getParent())       ;     int totalThread = parentThread.activeCount();      double cpuRatio = 0 ;     if (osName.toLowerCase().startsWith( "windows" )) {       cpuRatio = this .getCpuRatioForWindows();     }          // 構造返回對象      MonitorInfoBean infoBean = new MonitorInfoBean();     infoBean.setFreeMemory(freeMemory);     infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);     infoBean.setMaxMemory(maxMemory);     infoBean.setOsName(osName);     infoBean.setTotalMemory(totalMemory);     infoBean.setTotalMemorySize(totalMemorySize);     infoBean.setTotalThread(totalThread);     infoBean.setUsedMemory(usedMemory);     infoBean.setCpuRatio(cpuRatio);     return infoBean;   }    /** */ /**    * 獲得CPU使用率.    * @return 返回cpu使用率    * @author amg   * Creation date: 2008-4-25 - 下午06:05:11    */    private  double getCpuRatioForWindows() {     try {       String procCmd = System.getenv("windir" )           + "http://system32//wbem//wmic.exe process get Caption,CommandLine,"            + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount" ;       // 取進程信息        long [] c0 = readCpu(Runtime.getRuntime().exec(procCmd));       Thread.sleep(CPUTIME);       long [] c1 = readCpu(Runtime.getRuntime().exec(procCmd));       if (c0 != null && c1 != null ) {         long idletime = c1[ 0 ] - c0[ 0 ];         long busytime = c1[ 1 ] - c0[ 1 ];         return Double.valueOf(             PERCENT * (busytime) / (busytime + idletime))             .doubleValue();       } else {         return  0.0 ;       }     } catch (Exception ex) {       ex.printStackTrace();       return  0.0 ;     }   }    /** */ /**    * 讀取CPU信息.    * @param proc    * @return    * @author amg   * Creation date: 2008-4-25 - 下午06:10:14    */    private  long [] readCpu( final Process proc) {     long [] retn = new  long [ 2 ];     try {       proc.getOutputStream().close();       InputStreamReader ir = new InputStreamReader(proc.getInputStream());       LineNumberReader input = new LineNumberReader(ir);       String line = input.readLine();       if (line == null || line.length() < FAULTLENGTH) {         return  null ;       }       int capidx = line.indexOf( "Caption" );       int cmdidx = line.indexOf( "CommandLine" );       int rocidx = line.indexOf( "ReadOperationCount" );       int umtidx = line.indexOf( "UserModeTime" );       int kmtidx = line.indexOf( "KernelModeTime" );       int wocidx = line.indexOf( "WriteOperationCount" );       long idletime = 0 ;       long kneltime = 0 ;       long usertime = 0 ;       while ((line = input.readLine()) != null ) {         if (line.length() < wocidx) {           continue ;         }         // 字段出現順序:Caption,CommandLine,KernelModeTime,ReadOperationCount,          // ThreadCount,UserModeTime,WriteOperation          String caption = Bytes.substring(line, capidx, cmdidx - 1 )             .trim();         String cmd = Bytes.substring(line, cmdidx, kmtidx - 1 ).trim();         if (cmd.indexOf( "wmic.exe" ) >= 0 ) {           continue ;         }         // log.info("line="+line);          if (caption.equals( "System Idle Process" )             || caption.equals("System" )) {           idletime += Long.valueOf(               Bytes.substring(line, kmtidx, rocidx - 1 ).trim())               .longValue();           idletime += Long.valueOf(               Bytes.substring(line, umtidx, wocidx - 1 ).trim())               .longValue();           continue ;         }          kneltime += Long.valueOf(             Bytes.substring(line, kmtidx, rocidx - 1 ).trim())             .longValue();         usertime += Long.valueOf(             Bytes.substring(line, umtidx, wocidx - 1 ).trim())             .longValue();       }       retn[0 ] = idletime;       retn[1 ] = kneltime + usertime;       return retn;     } catch (Exception ex) {       ex.printStackTrace();     } finally {       try {         proc.getInputStream().close();       } catch (Exception e) {         e.printStackTrace();       }     }     return  null ;   }      /** */ /**    * 測試方法.    * @param args    * @throws Exception    * @author amg   * Creation date: 2008-4-30 - 下午04:47:29    */    public  static  void main(String[] args) throws Exception {     IMonitorService service = new MonitorServiceImpl();     MonitorInfoBean monitorInfo = service.getMonitorInfoBean();     System.out.println("cpu占有率=" + monitorInfo.getCpuRatio());          System.out.println("可使用內存=" + monitorInfo.getTotalMemory());     System.out.println("剩余內存=" + monitorInfo.getFreeMemory());     System.out.println("最大可使用內存=" + monitorInfo.getMaxMemory());          System.out.println("操作系統=" + monitorInfo.getOsName());     System.out.println("總的物理內存=" + monitorInfo.getTotalMemorySize() + "kb" );     System.out.println("剩余的物理內存=" + monitorInfo.getFreeMemory() + "kb" );     System.out.println("已使用的物理內存=" + monitorInfo.getUsedMemory() + "kb" );     System.out.println("線程總數=" + monitorInfo.getTotalThread() + "kb" );   } } 

 
該實現類中需要用到一個自己編寫byte的工具類,該類的代碼如下所示:

package com.amgkaka.performance;  /** */ /**  * byte操作類.  * @author amg * @version 1.0   * Creation date: 2008-4-30 - 下午04:57:23  */  public  class Bytes {   /** */ /**    * 由于String.subString對漢字處理存在問題(把一個漢字視為一個字節),因此在    * 包含漢字的字符串時存在隱患,現調整如下:    * @param src 要截取的字符串    * @param start_idx 開始坐標(包括該坐標)    * @param end_idx  截止坐標(包括該坐標)    * @return    */    public  static String substring(String src, int start_idx, int end_idx){     byte [] b = src.getBytes();     String tgt = "" ;     for ( int i=start_idx; i<=end_idx; i++){       tgt +=(char )b[i];     }     return tgt;   } } 

 
運行下MonitorBeanImpl類,讀者將會看到當前的內存、cpu利用率等信息。

PS:得到局域網內所有主機名的方法

import java.net.InetAddress;import java.net.UnknownHostException;public class A {   static public void main(String[] args) {  try {   //通過主機名稱得到IP地址  InetAddress address = InetAddress.getByName("192.168.9.148");  System.out.println("192.168.9.148"+": "+address.getHostAddress());//  通過IP得到主機名稱  String ips="192.168.9.",ip;  InetAddress addip;    for(int i=148;i<255;i++){    ip=ips+i;      addip=InetAddress.getByName(ip);      System.out.println(ip+": "+addip.getHostName());       }          }  catch(UnknownHostException uhe) {  System.err.println("Unable to find: "+"192.168.9.148");  } }  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 老河口市| 天等县| 云南省| 宁都县| 莱芜市| 望奎县| 纳雍县| 宁远县| 林周县| 长海县| 新化县| 资溪县| 平果县| 天峻县| 柘城县| 木里| 绩溪县| 思茅市| 新竹市| 莲花县| 金华市| 长岭县| 左权县| 澄城县| 舞阳县| 沙河市| 安丘市| 都匀市| 涡阳县| 尉犁县| 萝北县| 禹州市| 巴青县| 平南县| 福海县| 巩留县| 衡南县| 万荣县| 西充县| 文水县| 金山区|