一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 使用Java代碼獲取服務器性能信息及局域網內主機名

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

2020-01-20 11:43snoopy7713 JAVA教程

這篇文章主要介紹了使用Java代碼獲取服務器性能信息及局域網內主機名的方法,方便對服務器的遠程管理和團隊協作時用到,而且文中的方法無需調用jni,需要的朋友可以參考下

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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;
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
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" )
          + "\\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的工具類,該類的代碼如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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:得到局域網內所有主機名的方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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");
  }
 }
 }

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜毛片在线观看 | 四虎影视紧急入口地址大全 | 成人欧美一区在线视频在线观看 | 亚洲成在人线久久综合 | 韩国女主播在线大尺无遮挡 | 欧美男人天堂 | 亚欧毛片基地国产毛片基地 | 天天av天天翘天天综合网 | 欧美亚洲视频在线观看 | 国产精品久久久久无毒 | 97视频免费人人观看人人 | 免费看黄色大片 | 欧美三级小视频 | 手机在线伦理片 | 美女草b| 91在线精品老司机免费播放 | 国产午夜精品一区二区 | 成人a级特黄毛片 | 深夜日韩 | 肉文高h文 | 色视频综合 | 免费老外的毛片清高 | 国产日韩欧美色视频色在线观看 | 日本欧美不卡一区二区三区在线 | 欧美日韩一区二区中文字幕视频 | 欧美一级在线 | 国内精品91久久久久 | 98pao强力打造高清免费 | 国产精品永久免费视频观看 | 亚洲天堂网站在线 | 秀婷程仪公欲息肉婷在线观看 | 日韩视频在线免费 | 午夜爱爱爱爱爽爽爽视频网站 | 亚洲精品91香蕉综合区 | 国产日韩欧美综合一区二区三区 | 免费视频精品一区二区三区 | 久久久亚洲国产精品主播 | 韩国黄色网址 | 欧美日韩国产一区二区三区欧 | 8x8x拔插 | 成人免费视频一区 |