使用Java代碼獲取服務(wù)器性能信息及局域網(wǎng)內(nèi)主機(jī)名
最近做個(gè)項(xiàng)目,就是要取得cpu占有率等等的系統(tǒng)信息,一開(kāi)始以為要用動(dòng)態(tài)鏈接庫(kù)了,但后來(lái)發(fā)現(xiàn)可以像下面這樣做,不去調(diào)用jni,這樣省去了很多看新技術(shù)的時(shí)間o(∩_∩)o...
在Java中,可以獲得總的物理內(nèi)存、剩余的物理內(nèi)存、已使用的物理內(nèi)存等信息,下面例子可以取得這些信息,并且獲得在Windows下的內(nèi)存使用率。
首先編寫(xiě)一個(gè)MonitorInfoBean類,用來(lái)裝載監(jiān)控的一些信息,包括物理內(nèi)存、剩余的物理內(nèi)存、已使用的物理內(nèi)存、內(nèi)存使用率等字段,該類的代碼如下:
package com.amgkaka.performance;
/** */ /**
* 監(jiān)視信息的JavaBean類.
* @author amg
* @version 1.0
* Creation date: 2008-4-25 - 上午10:37:00
*/
public class MonitorInfoBean {
/** */ /** 可使用內(nèi)存. */
private long totalMemory;
/** */ /** 剩余內(nèi)存. */
private long freeMemory;
/** */ /** 最大可使用內(nèi)存. */
private long maxMemory;
/** */ /** 操作系統(tǒng). */
private String osName;
/** */ /** 總的物理內(nèi)存. */
private long totalMemorySize;
/** */ /** 剩余的物理內(nèi)存. */
private long freePhysicalMemorySize;
/** */ /** 已使用的物理內(nèi)存. */
private long usedMemory;
/** */ /** 線程總數(shù). */
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;
}
}
接著編寫(xiě)一個(gè)獲得當(dāng)前的監(jiān)控信息的接口,該類的代碼如下所示:
package com.amgkaka.performance;
/** */ /**
* 獲取系統(tǒng)信息的業(yè)務(wù)邏輯類接口.
* @author amg * @version 1.0
* Creation date: 2008-3-11 - 上午10:06:06
*/
public interface IMonitorService {
/** */ /**
* 獲得當(dāng)前的監(jiān)控對(duì)象.
* @return 返回構(gòu)造好的監(jiān)控對(duì)象
* @throws Exception
* @author amgkaka
* Creation date: 2008-4-25 - 上午10:45:08
*/
public MonitorInfoBean getMonitorInfoBean() throws Exception;
}
該類的實(shí)現(xiàn)類MonitorServiceImpl如下所示:
package com.amgkaka.performance;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import sun.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;
/** */ /**
* 獲取系統(tǒng)信息的業(yè)務(wù)邏輯實(shí)現(xiàn)類.
* @author amg * @version 1.0 Creation date: 2008-3-11 - 上午10:06:06
*/
public class MonitorServiceImpl implements IMonitorService {
//可以設(shè)置長(zhǎng)些,防止讀到運(yùn)行此次系統(tǒng)檢查時(shí)的cpu占用率,就不準(zhǔn)了
private static final int CPUTIME = 5000 ;
private static final int PERCENT = 100 ;
private static final int FAULTLENGTH = 10 ;
/** */ /**
* 獲得當(dāng)前的監(jiān)控對(duì)象.
* @return 返回構(gòu)造好的監(jiān)控對(duì)象
* @throws Exception
* @author amg * Creation date: 2008-4-25 - 上午10:45:08
*/
public MonitorInfoBean getMonitorInfoBean() throws Exception {
int kb = 1024 ;
// 可使用內(nèi)存
long totalMemory = Runtime.getRuntime().totalMemory() / kb;
// 剩余內(nèi)存
long freeMemory = Runtime.getRuntime().freeMemory() / kb;
// 最大可使用內(nèi)存
long maxMemory = Runtime.getRuntime().maxMemory() / kb;
OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory
.getOperatingSystemMXBean();
// 操作系統(tǒng)
String osName = System.getProperty("os.name" );
// 總的物理內(nèi)存
long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;
// 剩余的物理內(nèi)存
long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;
// 已使用的物理內(nèi)存
long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb
.getFreePhysicalMemorySize())
/ kb;
// 獲得線程總數(shù)
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();
}
// 構(gòu)造返回對(duì)象
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" ;
// 取進(jìn)程信息
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 ;
}
// 字段出現(xiàn)順序: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 ;
}
/** */ /**
* 測(cè)試方法.
* @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("可使用內(nèi)存=" + monitorInfo.getTotalMemory());
System.out.println("剩余內(nèi)存=" + monitorInfo.getFreeMemory());
System.out.println("最大可使用內(nèi)存=" + monitorInfo.getMaxMemory());
System.out.println("操作系統(tǒng)=" + monitorInfo.getOsName());
System.out.println("總的物理內(nèi)存=" + monitorInfo.getTotalMemorySize() + "kb" );
System.out.println("剩余的物理內(nèi)存=" + monitorInfo.getFreeMemory() + "kb" );
System.out.println("已使用的物理內(nèi)存=" + monitorInfo.getUsedMemory() + "kb" );
System.out.println("線程總數(shù)=" + monitorInfo.getTotalThread() + "kb" );
}
}
該實(shí)現(xiàn)類中需要用到一個(gè)自己編寫(xiě)byte的工具類,該類的代碼如下所示:
package com.amgkaka.performance;
/** */ /**
* byte操作類.
* @author amg * @version 1.0
* Creation date: 2008-4-30 - 下午04:57:23
*/
public class Bytes {
/** */ /**
* 由于String.subString對(duì)漢字處理存在問(wèn)題(把一個(gè)漢字視為一個(gè)字節(jié)),因此在
* 包含漢字的字符串時(shí)存在隱患,現(xiàn)調(diào)整如下:
* @param src 要截取的字符串
* @param start_idx 開(kāi)始坐標(biāo)(包括該坐標(biāo))
* @param end_idx 截止坐標(biāo)(包括該坐標(biāo))
* @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;
}
}
運(yùn)行下MonitorBeanImpl類,讀者將會(huì)看到當(dāng)前的內(nèi)存、cpu利用率等信息。
PS:得到局域網(wǎng)內(nèi)所有主機(jī)名的方法
import java.net.InetAddress;
import java.net.UnknownHostException;
public class A {
static public void main(String[] args) {
try {
//通過(guò)主機(jī)名稱得到IP地址
InetAddress address = InetAddress.getByName("192.168.9.148");
System.out.println("192.168.9.148"+": "+address.getHostAddress());
// 通過(guò)IP得到主機(jī)名稱
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");
}
}
}
相關(guān)文章
Java?Spring的核心與設(shè)計(jì)思想你知道嗎
這篇文章主要為大家詳細(xì)介紹了Java?Spring的核心與設(shè)計(jì)思想,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
RestTemplate的DELETE及PUT等請(qǐng)求方法使用精講
這篇文章主要為大家介紹了RestTemplate的DELETE及PUT等請(qǐng)求方法的使用精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
SpringBoot和Vue實(shí)現(xiàn)動(dòng)態(tài)二維碼的示例代碼
二維碼在現(xiàn)代社交和營(yíng)銷活動(dòng)中被廣泛使用,本文主要介紹了SpringBoot和Vue實(shí)現(xiàn)動(dòng)態(tài)二維碼的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
Java中HashMap和Hashtable的區(qū)別淺析
這篇文章主要介紹了Java中HashMap和Hashtable的區(qū)別淺析,本文總結(jié)了6條它們之間的不同之處,需要的朋友可以參考下2015-03-03
java使用DOM4J對(duì)XML文件進(jìn)行增刪改查操作
這篇文章主要為大家詳細(xì)介紹了java使用DOM4J對(duì)XML文件進(jìn)行增刪改查操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
java?mybatis如何操作postgresql?array數(shù)組類型
這篇文章主要介紹了java?mybatis如何操作postgresql?array數(shù)組類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
idea tomcat亂碼問(wèn)題的解決及相關(guān)設(shè)置的步驟
這篇文章主要介紹了idea tomcat亂碼問(wèn)題的解決及相關(guān)設(shè)置的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
JDBC PreparedStatement Like參數(shù)報(bào)錯(cuò)解決方案
這篇文章主要介紹了JDBC PreparedStatement Like參數(shù)報(bào)錯(cuò)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
SpringBoot整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證
Spring Security是一個(gè)可以為Java應(yīng)用程序提供全面安全服務(wù)的框架,同時(shí)它也可以輕松擴(kuò)展以滿足自定義需求,本文主要介紹了SpringBoot整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證,感興趣的可以了解一下2023-11-11

