您的位置:首页 > 编程语言 > Java开发

java用oshi实现监控电脑信息,cpu,内存,进程,硬盘,上传下载等信息.

2020-08-03 17:26 495 查看

使用的是从github直接clone的oshi类

监控电脑的进程,cpu使用率温度,内存的使用率,还有网络的上传下载,听到这个需求的时候我想到的是为什么不下载一个鲁大师😄.
当时说需要jmx,但是搜一搜发现使用oshi很方便,

public class demo {
public static void main(String[] args) {
// Options: ERROR > WARN > INFO > DEBUG > TRACE
Logger LOG = LoggerFactory.getLogger(demo.class);

LOG.info("Initializing System...");
SystemInfo si = new SystemInfo();

HardwareAbstractionLayer hal = si.getHardware();
OperatingSystem os = si.getOperatingSystem();

System.out.println(os);

LOG.info("Checking computer system...");
printComputerSystem(hal.getComputerSystem());

LOG.info("Checking Processor...");
printProcessor(hal.getProcessor());

LOG.info("Checking Memory...");
printMemory(hal.getMemory());

LOG.info("Checking CPU...");
printCpu(hal.getProcessor());

LOG.info("Checking Processes...");
printProcesses(os, hal.getMemory());

LOG.info("Checking Sensors...");
printSensors(hal.getSensors());

LOG.info("Checking Power sources...");
printPowerSources(hal.getPowerSources());

LOG.info("Checking Disks...");
printDisks(hal.getDiskStores());

LOG.info("Checking File System...");
printFileSystem(os.getFileSystem());

LOG.info("Checking Network interfaces...");
printNetworkInterfaces(hal.getNetworkIFs());

LOG.info("Checking Network parameterss...");
printNetworkParameters(os.getNetworkParams());

// hardware: displays
LOG.info("Checking Displays...");
printDisplays(hal.getDisplays());

// hardware: USB devices
LOG.info("Checking USB Devices...");
printUsbDevices(hal.getUsbDevices(true));
}

private static void printComputerSystem(final ComputerSystem computerSystem) {

System.out.println("manufacturer: " + computerSystem.getManufacturer());
System.out.println("model: " + computerSystem.getModel());
System.out.println("serialnumber: " + computerSystem.getSerialNumber());
final Firmware firmware = computerSystem.getFirmware();
System.out.println("firmware:");
System.out.println("  manufacturer: " + firmware.getManufacturer());
System.out.println("  name: " + firmware.getName());
System.out.println("  description: " + firmware.getDescription());
System.out.println("  version: " + firmware.getVersion());
System.out.println("  release date: " + (firmware.getReleaseDate() == null ? "unknown"
: firmware.getReleaseDate() == null ? "unknown" : FormatUtil.formatDate(firmware.getReleaseDate())));
final Baseboard baseboard = computerSystem.getBaseboard();
System.out.println("baseboard:");
System.out.println("  manufacturer: " + baseboard.getManufacturer());
System.out.println("  model: " + baseboard.getModel());
System.out.println("  version: " + baseboard.getVersion());
System.out.println("  serialnumber: " + baseboard.getSerialNumber());
}

private static void printProcessor(CentralProcessor processor) {
System.out.println(processor);
System.out.println(" " + processor.getPhysicalProcessorCount() + " physical CPU package(s)");
System.out.println(" " + processor.getPhysicalProcessorCount() + " physical CPU core(s)");
System.out.println(" " + processor.getLogicalProcessorCount() + " logical CPU(s)");

System.out.println("Identifier: " + processor.getIdentifier());
System.out.println("ProcessorID: " + processor.getProcessorID());
}

private static void printMemory(GlobalMemory memory) {
System.out.println("Memory: " + FormatUtil.formatBytes(memory.getAvailable()) + "/"
+ FormatUtil.formatBytes(memory.getTotal()));
System.out.println("Swap used: " + FormatUtil.formatBytes(memory.getSwapUsed()) + "/"
+ FormatUtil.formatBytes(memory.getSwapTotal()));
}

private static void printCpu(CentralProcessor processor) {
System.out.println("Uptime: " + FormatUtil.formatElapsedSecs(processor.getSystemUptime()));

long[] prevTicks = processor.getSystemCpuLoadTicks();
System.out.println("CPU, IOWait, and IRQ ticks @ 0 sec:" + Arrays.toString(prevTicks));
// Wait a second...
Util.sleep(1000);
long[] ticks = processor.getSystemCpuLoadTicks();
System.out.println("CPU, IOWait, and IRQ ticks @ 1 sec:" + Arrays.toString(ticks));
long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()];
long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()];
long sys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()];
long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()];
long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()];
long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()];
long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()];
long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()];
long totalCpu = user + nice + sys + idle + iowait + irq + softirq + steal;

System.out.format(
"User: %.1f%% Nice: %.1f%% System: %.1f%% Idle: %.1f%% IOwait: %.1f%% IRQ: %.1f%% SoftIRQ: %.1f%% Steal: %.1f%%%n",
100d * user / totalCpu, 100d * nice / totalCpu, 100d * sys / totalCpu, 100d * idle / totalCpu,
100d * iowait / totalCpu, 100d * irq / totalCpu, 100d * softirq / totalCpu, 100d * steal / totalCpu);
System.out.format("CPU load: %.1f%% (counting ticks)%n", processor.getSystemCpuLoadBetweenTicks() * 100);
System.out.format("CPU load: %.1f%% (OS MXBean)%n", processor.getSystemCpuLoad() * 100);
double[] loadAverage = processor.getSystemLoadAverage(3);
System.out.println("CPU load averages:" + (loadAverage[0] < 0 ? " N/A" : String.format(" %.2f", loadAverage[0]))
+ (loadAverage[1] < 0 ? " N/A" : String.format(" %.2f", loadAverage[1]))
+ (loadAverage[2] < 0 ? " N/A" : String.format(" %.2f", loadAverage[2])));
// per core CPU
StringBuilder procCpu = new StringBuilder("CPU load per processor:");
double[] load = processor.getProcessorCpuLoadBetweenTicks();
for (double avg : load) {
procCpu.append(String.format(" %.1f%%", avg * 100));
}
System.out.println(procCpu.toString());
}

private static void printProcesses(OperatingSystem os, GlobalMemory memory) {
System.out.println("Processes: " + os.getProcessCount() + ", Threads: " + os.getThreadCount());
// Sort by highest CPU
List<OSProcess> procs = Arrays.asList(os.getProcesses(5, ProcessSort.CPU));

System.out.println("   PID  %CPU %MEM       VSZ       RSS Name");
for (int i = 0; i < procs.size() && i < 5; i++) {
OSProcess p = procs.get(i);
System.out.format(" %5d %5.1f %4.1f %9s %9s %s%n", p.getProcessID(),
100d * (p.getKernelTime() + p.getUserTime()) / p.getUpTime(),
100d * p.getResidentSetSize() / memory.getTotal(), FormatUtil.formatBytes(p.getVirtualSize()),
FormatUtil.formatBytes(p.getResidentSetSize()), p.getName());
}
}

private static void printSensors(Sensors sensors) {
System.out.println("Sensors:");
System.out.format(" CPU Temperature: %.1f°C%n", sensors.getCpuTemperature());
System.out.println(" Fan Speeds: " + Arrays.toString(sensors.getFanSpeeds()));
System.out.format(" CPU Voltage: %.1fV%n", sensors.getCpuVoltage());
}

private static void printPowerSources(PowerSource[] powerSources) {
StringBuilder sb = new StringBuilder("Power: ");
if (powerSources.length == 0) {
sb.append("Unknown");
} else {
double timeRemaining = powerSources[0].getTimeRemaining();
if (timeRemaining < -1d) {
sb.append("Charging");
} else if (timeRemaining < 0d) {
sb.append("Calculating time remaining");
} else {
sb.append(String.format("%d:%02d remaining", (int) (timeRemaining / 3600),
(int) (timeRemaining / 60) % 60));
}
}
for (PowerSource pSource : powerSources) {
sb.append(String.format("%n %s @ %.1f%%", pSource.getName(), pSource.getRemainingCapacity() * 100d));
}
System.out.println(sb.toString());
}

private static void printDisks(HWDiskStore[] diskStores) {
System.out.println("Disks:");
for (HWDiskStore disk : diskStores) {
boolean readwrite = disk.getReads() > 0 || disk.getWrites() > 0;
System.out.format(" %s: (model: %s - S/N: %s) size: %s, reads: %s (%s), writes: %s (%s), xfer: %s ms%n",
disk.getName(), disk.getModel(), disk.getSerial(),
disk.getSize() > 0 ? FormatUtil.formatBytesDecimal(disk.getSize()) : "?",
readwrite ? disk.getReads() : "?", readwrite ? FormatUtil.formatBytes(disk.getReadBytes()) : "?",
readwrite ? disk.getWrites() : "?", readwrite ? FormatUtil.formatBytes(disk.getWriteBytes()) : "?",
readwrite ? disk.getTransferTime() : "?");
HWPartition[] partitions = disk.getPartitions();
if (partitions == null) {
// TODO Remove when all OS's implemented
continue;
}
for (HWPartition part : partitions) {
System.out.format(" |-- %s: %s (%s) Maj:Min=%d:%d, size: %s%s%n", part.getIdentification(),
part.getName(), part.getType(), part.getMajor(), part.getMinor(),
FormatUtil.formatBytesDecimal(part.getSize()),
part.getMountPoint().isEmpty() ? "" : " @ " + part.getMountPoint());
}
}
}

private static void printFileSystem(FileSystem fileSystem) {
System.out.println("File System:");

System.out.format(" File Descriptors: %d/%d%n", fileSystem.getOpenFileDescriptors(),
fileSystem.getMaxFileDescriptors());

OSFileStore[] fsArray = fileSystem.getFileStores();
for (OSFileStore fs : fsArray) {
long usable = fs.getUsableSpace();
long total = fs.getTotalSpace();
System.out.format(
" %s (%s) [%s] %s of %s free (%.1f%%) is %s "
+ (fs.getLogicalVolume() != null && fs.getLogicalVolume().length() > 0 ? "[%s]" : "%s")
+ " and is mounted at %s%n",
fs.getName(), fs.getDescription().isEmpty() ? "file system" : fs.getDescription(), fs.getType(),
FormatUtil.formatBytes(usable), FormatUtil.formatBytes(fs.getTotalSpace()), 100d * usable / total,
fs.getVolume(), fs.getLogicalVolume(), fs.getMount());
}
}

private static void printNetworkInterfaces(NetworkIF[] networkIFs) {
System.out.println("Network interfaces:");
for (NetworkIF net : networkIFs) {
System.out.format(" Name: %s (%s)%n", net.getName(), net.getDisplayName());
System.out.format("   MAC Address: %s %n", net.getMacaddr());
System.out.format("   MTU: %s, Speed: %s %n", net.getMTU(), FormatUtil.formatValue(net.getSpeed(), "bps"));
System.out.format("   IPv4: %s %n", Arrays.toString(net.getIPv4addr()));
System.out.format("   IPv6: %s %n", Arrays.toString(net.getIPv6addr()));

boolean hasData = net.getBytesRecv() > 0 || net.getBytesSent() > 0 || net.getPacketsRecv() > 0
|| net.getPacketsSent() > 0;
System.out.format("   Traffic: received %s/%s%s; transmitted %s/%s%s %n",
hasData ? net.getPacketsRecv() + " packets" : "?",
hasData ? FormatUtil.formatBytes(net.getBytesRecv()) : "?",
hasData ? " (" + net.getInErrors() + " err)" : "",
hasData ? net.getPacketsSent() + " packets" : "?",
hasData ? FormatUtil.formatBytes(net.getBytesSent()) : "?",
hasData ? " (" + net.getOutErrors() + " err)" : "");
}
}

private static void printNetworkParameters(NetworkParams networkParams) {
System.out.println("Network parameters:");
System.out.format(" Host name: %s%n", networkParams.getHostName());
System.out.format(" Domain name: %s%n", networkParams.getDomainName());
System.out.format(" DNS servers: %s%n", Arrays.toString(networkParams.getDnsServers()));
System.out.format(" IPv4 Gateway: %s%n", networkParams.getIpv4DefaultGateway());
System.out.format(" IPv6 Gateway: %s%n", networkParams.getIpv6DefaultGateway());
}

private static void printDisplays(Display[] displays) {
System.out.println("Displays:");
int i = 0;
for (Display display : displays) {
System.out.println(" Display " + i + ":");
System.out.println(display.toString());
i++;
}
}

private static void printUsbDevices(UsbDevice[] usbDevices) {
System.out.println("USB Devices:");
for (UsbDevice usbDevice : usbDevices) {
System.out.println(usbDevice.toString());
}

}

}

可以直接从GitHub上clone下来,放入项目中直接就可以使用,大多数是英文不太好看懂,不过仔细看看也可以看懂 , 下面忘记是在哪个大神的博客看到的代码直接复制来用了.算是实现了需求

//获取cpu信息
public static String printlnCpuInfo() throws InterruptedException {
//System.out.println("----------------cpu信息----------------");
SystemInfo systemInfo = new SystemInfo();
CentralProcessor processor = systemInfo.getHardware().getProcessor();
long[] prevTicks = processor.getSystemCpuLoadTicks();
// 睡眠1s
TimeUnit.SECONDS.sleep(1);
long[] ticks = processor.getSystemCpuLoadTicks();
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
System.out.println("----------------cpu信息----------------");
//System.out.println("cpu核数:" + processor.getLogicalProcessorCount());
//System.out.println("cpu系统使用率:" + new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));
//System.out.println("cpu用户使用率:" + new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));
//System.out.println("cpu当前等待率:" + new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu));
//System.out.println("cpu当前使用率:" + new DecimalFormat("#.##%").format(1.0-(idle * 1.0 / totalCpu)));
return new DecimalFormat("#.##%").format(1.0-(idle * 1.0 / totalCpu));
}

//获取内存使用率
public static String MemInfo(){
System.out.println("----------------主机内存信息----------------");
SystemInfo systemInfo = new SystemInfo();
GlobalMemory memory = systemInfo.getHardware().getMemory();
//总内存
long totalByte = memory.getTotal();
//剩余
long acaliableByte = memory.getAvailable();
//System.out.println("总内存 = " + formatByte(totalByte));
//System.out.println("使用" + formatByte(totalByte-acaliableByte));
//System.out.println("剩余内存 = " + formatByte(acaliableByte));
//System.out.println("使用率:" + new DecimalFormat("#.##%").format((totalByte-acaliableByte)*1.0/totalByte));
return new DecimalFormat("#.##%").format((totalByte-acaliableByte)*1.0/totalByte);
}

//二进制转换
public static String formatByte(long byteNumber){
//换算单位
double FORMAT = 1024.0;
double kbNumber = byteNumber/FORMAT;
if(kbNumber<FORMAT){
return new DecimalFormat("#.##KB").format(kbNumber);
}
double mbNumber = kbNumber/FORMAT;
if(mbNumber<FORMAT){
return new DecimalFormat("#.##MB").format(mbNumber);
}
double gbNumber = mbNumber/FORMAT;
if(gbNumber<FORMAT){
return new DecimalFormat("#.##GB").format(gbNumber);
}
double tbNumber = gbNumber/FORMAT;
return new DecimalFormat("#.##TB").format(tbNumber);
}

//获取网络上传和下载
public static Map<String,String> printNetworkInterfaces() {
System.out.println("Network interfaces:");
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
NetworkIF[] networkIFs = hal.getNetworkIFs();
int i=networkIFs.length-1;
NetworkIF net=networkIFs[i];

String in  = FormatUtil.formatBytes(net.getBytesRecv());
String out = FormatUtil.formatBytes(net.getBytesSent());
HashMap<String, String> map = new HashMap<>();
map.put("in",in);
map.put("out",out);
return map;
}

//获取进程数
public static int getProcessesCount(){
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();

int processCount = os.getProcessCount();
return processCount;
}

还有很多其他功能,获取jvm信息,硬盘信息等可以自己去看.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: