1 概述

  前段时间摸索在Java中怎么获取系统信息包括cpu、内存、硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插件进行获取。下面列举出了这两种方式获取系统信息的方式及代码。

2 使用Java自带包获取系统信息

2.1 使用Java自带包获取系统信息代码如下:

2.1.1 Bytes.java

public 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<=end_idx; i++){
tgt +=(char)b[i];
}
return tgt;
}
}

2.1.2 IMonitorService.java

public interface IMonitorService {
public MonitorInfoBean getMonitorInfoBean() throws Exception;
}

2.1.3 MonitorInfoBean.java

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;
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;
}
}

2.1.4

import java.io.InputStreamReader;
import java.io.LineNumberReader; //import sun.management.ManagementFactory;
//import com.sun.management.OperatingSystemMXBean;
import java.io.*;
import java.lang.management.ManagementFactory;
import java.util.StringTokenizer; 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; 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());
}
} 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;
}
} 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;
} 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;
} public static void main(String[] args) throws Exception {
IMonitorService service = new MonitorServiceImpl();
MonitorInfoBean monitorInfo = service.getMonitorInfoBean();
System.out.println("cpu percent: " + monitorInfo.getCpuRatio());
System.out.println("can use memory: " + monitorInfo.getTotalMemory());
System.out.println("ideal memory: " + monitorInfo.getFreeMemory());
System.out.println("largest memory: " + monitorInfo.getMaxMemory());
System.out.println("all memory: " + monitorInfo.getTotalMemorySize() + "kb");
System.out.println("ideal memory: " + monitorInfo.getFreeMemory() + "kb");
System.out.println("used memory: " + monitorInfo.getUsedMemory() + "kb");
System.out.println("thread num: " + monitorInfo.getTotalThread() + "kb");
}
}

2.2 执行结果如下图所示:

aaarticlea/png;base64,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" alt="" />

3 使用sigar获取系统信息

3.1 下载安装sigar-1.6.4.zip

使用java自带的包获取系统数据,容易找不到包,尤其是内存信息不够准确,所以选择使用sigar获取系统信息。

下载地址:http://sourceforge.net/projects/sigar/files/latest/download?source=files

解压压缩包,将lib下sigar.jar导入eclipse的CLASSPATH中,再将sigar-x86-winnt.dll存入Java的bin目录即可。

3.2 代码实现如下:

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
import java.util.Properties;
import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.Mem;
import org.hyperic.sigar.NetFlags;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.NetInterfaceStat;
import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.Swap;
import org.hyperic.sigar.Who; public class RuntimeTest {
public static void main(String[] args) {
try {
// System信息,从jvm获取
property();
System.out.println("----------------------------------");
// cpu信息
cpu();
System.out.println("----------------------------------");
// 内存信息
memory();
System.out.println("----------------------------------");
// 操作系统信息
os();
System.out.println("----------------------------------");
// 用户信息
who();
System.out.println("----------------------------------");
// 文件系统信息
file();
System.out.println("----------------------------------");
// 网络信息
net();
System.out.println("----------------------------------");
// 以太网信息
ethernet();
System.out.println("----------------------------------");
} catch (Exception e1) {
e1.printStackTrace();
}
} private static void property() throws UnknownHostException {
Runtime r = Runtime.getRuntime();
Properties props = System.getProperties();
InetAddress addr;
addr = InetAddress.getLocalHost();
String ip = addr.getHostAddress();
Map<String, String> map = System.getenv();
String userName = map.get("USERNAME");// 获取用户名
String computerName = map.get("COMPUTERNAME");// 获取计算机名
String userDomain = map.get("USERDOMAIN");// 获取计算机域名
System.out.println("用户名: " + userName);
System.out.println("计算机名: " + computerName);
System.out.println("计算机域名: " + userDomain);
System.out.println("本地ip地址: " + ip);
System.out.println("本地主机名: " + addr.getHostName());
System.out.println("JVM可以使用的总内存: " + r.totalMemory());
System.out.println("JVM可以使用的剩余内存: " + r.freeMemory());
System.out.println("JVM可以使用的处理器个数: " + r.availableProcessors());
System.out.println("Java的运行环境版本: " + props.getProperty("java.version"));
System.out.println("Java的运行环境供应商: " + props.getProperty("java.vendor"));
System.out.println("Java供应商的URL: " + props.getProperty("java.vendor.url"));
System.out.println("Java的安装路径: " + props.getProperty("java.home"));
System.out.println("Java的虚拟机规范版本: " + props.getProperty("java.vm.specification.version"));
System.out.println("Java的虚拟机规范供应商: " + props.getProperty("java.vm.specification.vendor"));
System.out.println("Java的虚拟机规范名称: " + props.getProperty("java.vm.specification.name"));
System.out.println("Java的虚拟机实现版本: " + props.getProperty("java.vm.version"));
System.out.println("Java的虚拟机实现供应商: " + props.getProperty("java.vm.vendor"));
System.out.println("Java的虚拟机实现名称: " + props.getProperty("java.vm.name"));
System.out.println("Java运行时环境规范版本: " + props.getProperty("java.specification.version"));
System.out.println("Java运行时环境规范供应商: " + props.getProperty("java.specification.vender"));
System.out.println("Java运行时环境规范名称: " + props.getProperty("java.specification.name"));
System.out.println("Java的类格式版本号: " + props.getProperty("java.class.version"));
System.out.println("Java的类路径: " + props.getProperty("java.class.path"));
System.out.println("加载库时搜索的路径列表: " + props.getProperty("java.library.path"));
System.out.println("默认的临时文件路径: " + props.getProperty("java.io.tmpdir"));
System.out.println("一个或多个扩展目录的路径: " + props.getProperty("java.ext.dirs"));
System.out.println("操作系统的名称: " + props.getProperty("os.name"));
System.out.println("操作系统的构架: " + props.getProperty("os.arch"));
System.out.println("操作系统的版本: " + props.getProperty("os.version"));
System.out.println("文件分隔符: " + props.getProperty("file.separator"));
System.out.println("路径分隔符: " + props.getProperty("path.separator"));
System.out.println("行分隔符: " + props.getProperty("line.separator"));
System.out.println("用户的账户名称: " + props.getProperty("user.name"));
System.out.println("用户的主目录: " + props.getProperty("user.home"));
System.out.println("用户的当前工作目录: " + props.getProperty("user.dir"));
} private static void memory() throws SigarException {
Sigar sigar = new Sigar();
Mem mem = sigar.getMem();
// 内存总量
System.out.println("内存总量: " + mem.getTotal() / 1024L + "K av");
// 当前内存使用量
System.out.println("当前内存使用量: " + mem.getUsed() / 1024L + "K used");
// 当前内存剩余量
System.out.println("当前内存剩余量: " + mem.getFree() / 1024L + "K free");
Swap swap = sigar.getSwap();
// 交换区总量
System.out.println("交换区总量: " + swap.getTotal() / 1024L + "K av");
// 当前交换区使用量
System.out.println("当前交换区使用量: " + swap.getUsed() / 1024L + "K used");
// 当前交换区剩余量
System.out.println("当前交换区剩余量: " + swap.getFree() / 1024L + "K free");
} private static void cpu() throws SigarException {
Sigar sigar = new Sigar();
CpuInfo infos[] = sigar.getCpuInfoList();
CpuPerc cpuList[] = null;
cpuList = sigar.getCpuPercList();
for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用
CpuInfo info = infos[i];
System.out.println("第" + (i + 1) + "块CPU信息");
System.out.println("CPU的总量MHz: " + info.getMhz());// CPU的总量MHz
System.out.println("CPU生产商: " + info.getVendor());// 获得CPU的卖主,如:Intel
System.out.println("CPU类别: " + info.getModel());// 获得CPU的类别,如:Celeron
System.out.println("CPU缓存数量: " + info.getCacheSize());// 缓冲存储器数量
printCpuPerc(cpuList[i]);
}
} private static void printCpuPerc(CpuPerc cpu) {
System.out.println("CPU用户使用率: " + CpuPerc.format(cpu.getUser()));// 用户使用率
System.out.println("CPU系统使用率: " + CpuPerc.format(cpu.getSys()));// 系统使用率
System.out.println("CPU当前等待率: " + CpuPerc.format(cpu.getWait()));// 当前等待率
System.out.println("CPU当前错误率: " + CpuPerc.format(cpu.getNice()));//
System.out.println("CPU当前空闲率: " + CpuPerc.format(cpu.getIdle()));// 当前空闲率
System.out.println("CPU总的使用率: " + CpuPerc.format(cpu.getCombined()));// 总的使用率
} private static void os() {
OperatingSystem OS = OperatingSystem.getInstance();
// 操作系统内核类型如: 386、486、586等x86
System.out.println("操作系统: " + OS.getArch());
System.out.println("操作系统CpuEndian(): " + OS.getCpuEndian());//
System.out.println("操作系统DataModel(): " + OS.getDataModel());//
// 系统描述
System.out.println("操作系统的描述: " + OS.getDescription());
// 操作系统类型
// System.out.println("OS.getName(): " + OS.getName());
// System.out.println("OS.getPatchLevel(): " + OS.getPatchLevel());//
// 操作系统的卖主
System.out.println("操作系统的卖主: " + OS.getVendor());
// 卖主名称
System.out.println("操作系统的卖主名: " + OS.getVendorCodeName());
// 操作系统名称
System.out.println("操作系统名称: " + OS.getVendorName());
// 操作系统卖主类型
System.out.println("操作系统卖主类型: " + OS.getVendorVersion());
// 操作系统的版本号
System.out.println("操作系统的版本号: " + OS.getVersion());
} private static void who() throws SigarException {
Sigar sigar = new Sigar();
Who who[] = sigar.getWhoList();
if (who != null && who.length > 0) {
for (int i = 0; i < who.length; i++) {
// System.out.println("当前系统进程表中的用户名" + String.valueOf(i));
Who _who = who[i];
System.out.println("用户控制台: " + _who.getDevice());
System.out.println("用户host: " + _who.getHost());
// System.out.println("getTime(): " + _who.getTime());
// 当前系统进程表中的用户名
System.out.println("当前系统进程表中的用户名: " + _who.getUser());
}
}
} private static void file() throws Exception {
Sigar sigar = new Sigar();
FileSystem fslist[] = sigar.getFileSystemList();
for (int i = 0; i < fslist.length; i++) {
System.out.println("分区的盘符名称" + i);
FileSystem fs = fslist[i];
// 分区的盘符名称
System.out.println("盘符名称: " + fs.getDevName());
// 分区的盘符名称
System.out.println("盘符路径: " + fs.getDirName());
System.out.println("盘符标志: " + fs.getFlags());//
// 文件系统类型,比如 FAT32、NTFS
System.out.println("盘符类型: " + fs.getSysTypeName());
// 文件系统类型名,比如本地硬盘、光驱、网络文件系统等
System.out.println("盘符类型名: " + fs.getTypeName());
// 文件系统类型
System.out.println("盘符文件系统类型: " + fs.getType());
FileSystemUsage usage = null;
usage = sigar.getFileSystemUsage(fs.getDirName());
switch (fs.getType()) {
case 0: // TYPE_UNKNOWN :未知
break;
case 1: // TYPE_NONE
break;
case 2: // TYPE_LOCAL_DISK : 本地硬盘
// 文件系统总大小
System.out.println(fs.getDevName() + "总大小: " + usage.getTotal() + "KB");
// 文件系统剩余大小
System.out.println(fs.getDevName() + "剩余大小: " + usage.getFree() + "KB");
// 文件系统可用大小
System.out.println(fs.getDevName() + "可用大小: " + usage.getAvail() + "KB");
// 文件系统已经使用量
System.out.println(fs.getDevName() + "已经使用量: " + usage.getUsed() + "KB");
double usePercent = usage.getUsePercent() * 100D;
// 文件系统资源的利用率
System.out.println(fs.getDevName() + "资源的利用率: " + usePercent + "%");
break;
case 3:// TYPE_NETWORK :网络
break;
case 4:// TYPE_RAM_DISK :闪存
break;
case 5:// TYPE_CDROM :光驱
break;
case 6:// TYPE_SWAP :页面交换
break;
}
System.out.println(fs.getDevName() + "读出: " + usage.getDiskReads());
System.out.println(fs.getDevName() + "写入: " + usage.getDiskWrites());
}
return;
} private static void net() throws Exception {
Sigar sigar = new Sigar();
String ifNames[] = sigar.getNetInterfaceList();
for (int i = 0; i < ifNames.length; i++) {
String name = ifNames[i];
NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name);
System.out.println("网络设备名: " + name);// 网络设备名
System.out.println("IP地址: " + ifconfig.getAddress());// IP地址
System.out.println("子网掩码: " + ifconfig.getNetmask());// 子网掩码
if ((ifconfig.getFlags() & 1L) <= 0L) {
System.out.println("!IFF_UP...skipping getNetInterfaceStat");
continue;
}
NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name);
System.out.println(name + "接收的总包裹数:" + ifstat.getRxPackets());// 接收的总包裹数
System.out.println(name + "发送的总包裹数:" + ifstat.getTxPackets());// 发送的总包裹数
System.out.println(name + "接收到的总字节数:" + ifstat.getRxBytes());// 接收到的总字节数
System.out.println(name + "发送的总字节数:" + ifstat.getTxBytes());// 发送的总字节数
System.out.println(name + "接收到的错误包数:" + ifstat.getRxErrors());// 接收到的错误包数
System.out.println(name + "发送数据包时的错误数:" + ifstat.getTxErrors());// 发送数据包时的错误数
System.out.println(name + "接收时丢弃的包数:" + ifstat.getRxDropped());// 接收时丢弃的包数
System.out.println(name + "发送时丢弃的包数:" + ifstat.getTxDropped());// 发送时丢弃的包数
}
} private static void ethernet() throws SigarException {
Sigar sigar = null;
sigar = new Sigar();
String[] ifaces = sigar.getNetInterfaceList();
for (int i = 0; i < ifaces.length; i++) {
NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(ifaces[i]);
if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0
|| NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) {
continue;
}
System.out.println(cfg.getName() + "IP地址:" + cfg.getAddress());// IP地址
System.out.println(cfg.getName() + "网关广播地址:" + cfg.getBroadcast());// 网关广播地址
System.out.println(cfg.getName() + "网卡MAC地址:" + cfg.getHwaddr());// 网卡MAC地址
System.out.println(cfg.getName() + "子网掩码:" + cfg.getNetmask());// 子网掩码
System.out.println(cfg.getName() + "网卡描述信息:" + cfg.getDescription());// 网卡描述信息
System.out.println(cfg.getName() + "网卡类型" + cfg.getType());//
}
}
}

  原创文章欢迎转载,转载时请注明出处。

  作者推荐文章:

    》Java自学之道

    》Eclipse中部署Hadoop2.3.0并直接在Eclipse中提交mapreduce任务

    》Java如何获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络等)

    》Java如何生成二维码过程详解

Java如何获取系统cpu、内存、硬盘信息的更多相关文章

  1. Windows 性能监视器的基本指标(CPU,内存,硬盘参数)

    转载:http://kms.lenovots.com/kb/article.php?id=7045 Windows 性能监视器的基本指标(CPU,内存,硬盘参数) 作为一个系统工程师来说,要看懂监控的 ...

  2. java中获取系统属性以及环境变量

    java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...

  3. VPS性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench和压力测试

    现在便宜的VPS主机越来越多了,一些美国的VPS主机甚至给出1美元一月的VPS,堪比虚拟主机还要便宜,巨大的价格优势吸引不少人购买和使用,而近些年来国内的主机商也开始意识到便宜的VPS对草根站长的诱惑 ...

  4. Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数)

    [转]Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数) 作为一个系统工程师来说,要看懂监控的数据至关重要,关系着优化和分析出现的问题.我是在运维过程中要用到的.因此,今天给出Wind ...

  5. 主机性能监控之wmi 获取系统信息及内存性能信息

    标 题: 主机性能监控之wmi 获取系统信息及内存性能信息作 者: itdef链 接: http://www.cnblogs.com/itdef/p/3990240.html 欢迎转帖 请保持文本完整 ...

  6. java后台获取和js拼接展示信息

    java后台获取和js拼接展示信息: html页面代码: <div class="results-bd"> <table id="activityInf ...

  7. Windows系统CPU内存网络性能统计第一篇 内存

    最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量.现在将其整理一下(共有三篇),希望对大家有所帮助. 目录如下: 1.<Wind ...

  8. c++ 如何获取系统时间 - zjnig711的信息仓库 - 博客频道 - CSDN.NET

    c++ 如何获取系统时间 - zjnig711的信息仓库 - 博客频道 - CSDN.NET c++ 如何获取系统时间 分类: C/C++ 2008-05-08 22:15 14115人阅读 评论(5 ...

  9. Java 如何获取系统时间

    Java 如何获取系统时间 import java.text.SimpleDateFormat; import java.util.Date; public class Test { public s ...

随机推荐

  1. Java for LeetCode 169 Majority Element

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  2. codeforces 476B.Dreamoon and WiFi 解题报告

    题目链接:http://codeforces.com/problemset/problem/476/B 题目意思:给出两个字符串str1, str2,其中,str1 只由 '+' 和 '-' 组成,而 ...

  3. 学习cocos-js的准备工作

    我学习 cocos2d-js 的方向: 学习 cocos2d-js 的 HTML5 版本:即 canvas 渲染. 下载cocos-js 文件 地址: http://www.cocos2d-x.org ...

  4. 寻找代表元(codevs 2776)

    题目描述 Description 广州二中苏元实验学校一共有n个社团,分别用1到n编号.广州二中苏元实验学校一共有m个人,分别用1到m编号.每个人可以参加一个或多个社团,也可以不参加任何社团.每个社团 ...

  5. Stanford大学机器学习公开课(五):生成学习算法、高斯判别、朴素贝叶斯

    (一)生成学习算法 在线性回归和Logistic回归这种类型的学习算法中我们探讨的模型都是p(y|x;θ),即给定x的情况探讨y的条件概率分布.如二分类问题,不管是感知器算法还是逻辑回归算法,都是在解 ...

  6. 现在不能使用foxmail同步qq记事本功能,可能是对字数的大小有限制

    那么在经过了两个星期的时间完成的主要功能就是幻灯片和站点管理,在之后还有更多的任务要做,本来从时间的安排上不太合理,在这个月底要基本完成,主要是其他的组员也有比较重的任务,那么就是需要随时有一个状态, ...

  7. js call apply caller callee bind

    call apply bind作用类似.即调用一个对象的一个方法,以另一个对象替换当前对象. call 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) ...

  8. javascript散列表实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. node.js打开浏览器

    通过nodejs的child_process识别环境, 用不同的CLI打开默认浏览器: var child_process = require("child_process"); ...

  10. ZOJ2332 Gems(最大流)

    题目大概说,alsomagic有宝石,宝石有颜色和形状两个属性:他有一种法力可以将某些颜色形状的宝石转化成另一种颜色形状的宝石:他的女朋友对各个颜色都有一定的容忍数量,而他自己也对各个形状都有一定的容 ...