java的探针,获得系统相关的信息

package com.bumt.police.test;

import java.io.BufferedReader;

import java.io.File;

import java.io.IOException;

 import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.LineNumberReader;

 import java.util.StringTokenizer;

 import sun.management.ManagementFactory;

 import com.sun.management.OperatingSystemMXBean;

public class MonitorServiceImpl implements IMonitorService

{

private static final int CPUTIME = 30;

private static final int PERCENT = 100;

private static final int FAULTLENGTH = 10;

private static final File versionFile = new File("/proc/version");

private static String linuxVersion = null; /

** * 获得当前的监控对象. * @return 返回构造好的监控对象 * @throws Exception * @author GuoHuang */ 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();

}

else

{

cpuRatio = this.getCpuRateForLinux();

} // 构造返回对象

 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;

}

private static double getCpuRateForLinux(){

InputStream is = null;

InputStreamReader isr = null; BufferedReader brStat = null;

StringTokenizer tokenStat = null;

try{

System.out.println("Get usage rate of CUP , linux version: "+linuxVersion);

Process process = Runtime.getRuntime().exec("top -b -n 1");

is = process.getInputStream();

isr = new InputStreamReader(is);

brStat = new BufferedReader(isr);

if(linuxVersion.equals("2.4")){

brStat.readLine();

brStat.readLine();

 brStat.readLine();

brStat.readLine();

tokenStat = new StringTokenizer(brStat.readLine());

 tokenStat.nextToken();

 tokenStat.nextToken();

 String user = tokenStat.nextToken();

tokenStat.nextToken();

String system = tokenStat.nextToken();

tokenStat.nextToken();

String nice = tokenStat.nextToken();

System.out.println(user+" , "+system+" , "+nice);

 user = user.substring(0,user.indexOf("%"));

 system = system.substring(0,system.indexOf("%"));

nice = nice.substring(0,nice.indexOf("%"));

float userUsage = new Float(user).floatValue();

 float systemUsage = new Float(system).floatValue();

float niceUsage = new Float(nice).floatValue();

return (userUsage+systemUsage+niceUsage)/100;

}

else{

 brStat.readLine();

brStat.readLine();

tokenStat = new StringTokenizer(brStat.readLine());

 tokenStat.nextToken();

 tokenStat.nextToken();

tokenStat.nextToken();

 tokenStat.nextToken();

tokenStat.nextToken();

 tokenStat.nextToken();

tokenStat.nextToken();

 String cpuUsage = tokenStat.nextToken();

System.out.println("CPU idle : "+cpuUsage);

Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf("%")));

 return (1-usage.floatValue()/100);

} }

catch(IOException ioe){

System.out.println(ioe.getMessage());

freeResource(is, isr, brStat);

return 1;

} finally{

freeResource(is, isr, brStat);

} }

private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br){

 try{

if(is!=null) is.close();

if(isr!=null) isr.close();

if(br!=null) br.close();

}catch(IOException ioe){ System.out.println(ioe.getMessage());

 } } /** * 获得CPU使用率. * @return 返回cpu使用率 * @author GuoHuang */ 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 GuoHuang */

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() = 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;

}

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");

 } }

class Bytes {

 public static String substring(String src, int start_idx, int end_idx)

{ byte[] b = src.getBytes(); String tgt = "";

for(int i=start_idx; i

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值