??????在Java中,可以獲得總的物理內存、剩余的物理內存、已使用的物理內存等信息,本例講解如何取得這些信息,并且獲得在Windows下的內存使用率。
???? 首先編寫一個MonitorInfoBean類,用來裝載監(jiān)控的一些信息,包括物理內存、剩余的物理內存、已使用的物理內存、內存使用率等字段,該類的代碼如下:
package?com.amigo.performance;


/**?*//**
?*?監(jiān)視信息的JavaBean類.
?*?@author?<a?href="mailto:xiexingxing1121@126.com">AmigoXie</a>
?*?@version?1.0?
?*?Creation?date:?2008-4-25?-?上午10:37:00
?*/

public?class?MonitorInfoBean?
{

????/**?*//**?可使用內存.?*/
????private?long?totalMemory;
????

????/**?*//**?剩余內存.?*/
????private?long?freeMemory;
????

????/**?*//**?最大可使用內存.?*/
????private?long?maxMemory;
????

????/**?*//**?操作系統(tǒng).?*/
????private?String?osName;
????

????/**?*//**?總的物理內存.?*/
????private?long?totalMemorySize;
????

????/**?*//**?剩余的物理內存.?*/
????private?long?freePhysicalMemorySize;
????

????/**?*//**?已使用的物理內存.?*/
????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;
????}
}

???? 接著編寫一個獲得當前的監(jiān)控信息的接口,該類的代碼如下所示:
package?com.amigo.performance;


/**?*//**
?*?獲取系統(tǒng)信息的業(yè)務邏輯類接口.
?*?@author?<a?href="mailto:xiexingxing1121@126.com">AmigoXie</a>
?*?@version?1.0?
?*?Creation?date:?2008-3-11?-?上午10:06:06
?*/

public?interface?IMonitorService?
{

????/**?*//**
?????*?獲得當前的監(jiān)控對象.
?????*?@return?返回構造好的監(jiān)控對象
?????*?@throws?Exception
?????*?@author?<a?href="mailto:xiexingxing1121@126.com">AmigoXie</a>
?????*?Creation?date:?2008-4-25?-?上午10:45:08
?????*/
????public?MonitorInfoBean?getMonitorInfoBean()?throws?Exception;

}???? 該類的實現(xiàn)類MonitorServiceImpl如下所示:
package?com.amigo.performance;

import?java.io.InputStreamReader;
import?java.io.LineNumberReader;

import?sun.management.ManagementFactory;

import?com.sun.management.OperatingSystemMXBean;


/**?*//**
?*?獲取系統(tǒng)信息的業(yè)務邏輯實現(xiàn)類.
?*?@author?<a?href="mailto:xiexingxing1121@126.com">AmigoXie</a>
?*?@version?1.0?Creation?date:?2008-3-11?-?上午10:06:06
?*/

public?class?MonitorServiceImpl?implements?IMonitorService?
{
????
????private?static?final?int?CPUTIME?=?30;

????private?static?final?int?PERCENT?=?100;

????private?static?final?int?FAULTLENGTH?=?10;


????/**?*//**
?????*?獲得當前的監(jiān)控對象.
?????*?@return?返回構造好的監(jiān)控對象
?????*?@throws?Exception
?????*?@author?<a?href="mailto:xiexingxing1121@126.com">AmigoXie</a>
?????*?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();

????????//?操作系統(tǒng)
????????String?osName?=?System.getProperty("os.name");
????????//?總的物理內存
????????long?totalMemorySize?=?osmxb.getTotalPhysicalMemorySize()?/?kb;
????????//?剩余的物理內存
????????long?freePhysicalMemorySize?=?osmxb.getFreePhysicalMemorySize()?/?kb;
????????//?已使用的物理內存
????????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();
????????}
????????
????????//?構造返回對象
????????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?<a?href="mailto:xiexingxing1121@126.com">AmigoXie</a>
?????*?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?<a?href="mailto:xiexingxing1121@126.com">AmigoXie</a>
?????*?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;
????}
????

????/**?*//**
?????*?測試方法.
?????*?@param?args
?????*?@throws?Exception
?????*?@author?<a?href="mailto:xiexingxing1121@126.com">AmigoXie</a>
?????*?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("操作系統(tǒng)="?+?monitorInfo.getOsName());
????????System.out.println("總的物理內存="?+?monitorInfo.getTotalMemorySize()?+?"kb");
????????System.out.println("剩余的物理內存="?+?monitorInfo.getFreeMemory()?+?"kb");
????????System.out.println("已使用的物理內存="?+?monitorInfo.getUsedMemory()?+?"kb");
????????System.out.println("線程總數(shù)="?+?monitorInfo.getTotalThread()?+?"kb");
????}
}

??????? 該實現(xiàn)類中需要用到一個自己編寫byte的工具類,該類的代碼如下所示:
package?com.amigo.performance;


/**?*//**
?*?byte操作類.
?*?@author?<a?href="mailto:xiexingxing1121@126.com">AmigoXie</a>
?*?@version?1.0?
?*?Creation?date:?2008-4-30?-?下午04:57:23
?*/

public?class?Bytes?
{

????/**?*//**
?????*?由于String.subString對漢字處理存在問題(把一個漢字視為一個字節(jié)),因此在
?????*?包含漢字的字符串時存在隱患,現(xiàn)調整如下:
?????*?@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利用率等信息。