OSHI-操作系统和硬件信息库

文章目录
- 引言
- 一、快速入门
- 1.1 OSHI的简介
- 1.2 引入依赖
- 1.3 涉及的包(package)
- 1.4 涉及的核心类
- 二、操作系统信息:OperatingSystem
- 2.1 总揽
- 2.2 文件系统信息:FileSystem
- 2.3 网络参数信息:NetworkParams
- 2.4 进程信息:OSProcess
- 2.5 线程信息:OSThread
- 三、硬件信息:Hardware
- 3.1 硬件信息:HardwareAbstractionLayer
- 3.1.1 总揽
- 3.1.2 磁盘信息:HWDiskStore
- 3.1.3 内存信息:Memory
- 3.1.4 显卡信息:graphicsCard
- 3.1.5 网络接口信息:NetworkIF
- 3.1.6 电源信息:PowerSource
- 3.1.7 传感器信息:Sensors
- 3.1.8 usb设备信息:UsbDevice
- 3.2 CPU信息:CentralProcessor
- 3.3 计算机系统:ComputerSystem
- 四、使用场景
- 4.1 获取 CPU 信息
- 4.2 获取内存信息
- 4.3 获取服务器信息
- 4.4 获取Java虚拟机信息
- 4.5 获取系统文件相关信息
- 4.6 获取磁盘信息
- 小结
引言
最近我们负责的某行业的业务平台,出现了一个非常奇葩的问题。这个项目涉及到软件平台厂家、服务器厂家、存储厂家以及真正的用户等四方关系,而我们主要负责软件平台的研发工作。平台正常运行了2年多了,去年年底存储盘阵中出现历史巡检数据丢失或者无法使用的诡异问题,软件、服务以及存储各方对根据运行日志进行了审计,各自都说没有问题,接着,请了比较权威的第三方测评单位,召开了5次讨论会,也没有分析出真正的原因, 因为每家只能证明自身没有问题,并不能证明问题真正的原因是什么环节,所以只能几家摊钱恢复数据。
俗话说:“吃一堑长一智”。业务平台作为应用层,是最接近用户的。平台一出问题,给用户的第一印象就是这个平台太烂了,又出问题了。为了以后出现问题,软件平台可以对问题进行实时追踪和根据历史数据运行记录进行审计,便于更快速的缩小问题范围,更精确的定位问题。
一、快速入门
1.1 OSHI的简介
谈到监控,最快捷的还是使用Java本身进行对JVM和操作系统的监控,方便快捷又可靠。OSHI(Operating System and Hardware Information)是Java的免费的基于JNA的(本机)操作系统和硬件信息库。它提供了一组简单易用的API,可以用于检索和监控诸如操作系统类型、处理器信息、内存使用情况、硬盘信息、网络接口等系统和硬件相关的数据。oshi支持的主要功能包括:
- 获取操作系统信息:可以获取操作系统的名称、版本、构建信息、位数等。还可以获取操作系统的启动时间、系统负载、当前进程数等信息。
- 获取硬件信息:可以获取处理器(CPU)的信息,包括型号、频率、核心数、温度等。还可以获取内存(RAM)的信息,包括总容量、可用容量、使用率等。此外,还可以获取硬盘(磁盘)的信息,包括型号、容量、使用率等。还可以获取电池、网卡、USB设备等硬件的信息。
- 获取网络信息:可以获取网络接口(网卡)的信息,包括名称、IP地址、MAC地址、接收和发送的数据量等。
- 监控系统和硬件:可以通过OSHI提供的API实时监控和收集系统和硬件的数据,例如CPU使用率、内存使用情况、网络流量等。
总的来说,OSHI是一个强大而易于使用的Java库,可用于获取和监控操作系统和硬件信息,帮助你编写更具交互性和功能性的系统监控、硬件信息获取和性能调优的应用程序。
oshi官方参考文档:https://www.oshi.ooo/oshi-core/apidocs/
1.2 引入依赖
OSHI 不需要安装任何额外的本地库,因此接入起来很方便。只需将OSHI库添加到项目的依赖项中,并使用OSHI提供的API来获取所需的系统和硬件信息,可以根据需要选择性地获取和处理各种信息。通过配置 Maven 依赖来引入 OSHI,如下所示:
<!-- https://mvnrepository.com/artifact/com.github.oshi/oshi-core -->
<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.4.1</version>
</dependency>
这里注意的是,不同版本的 JDK 环境,需要引用不同版本的包。由于笔者使用的JDK8,这里引入的是 oshi-core-6.4.1。
1.3 涉及的包(package)
| 包路径 | 说明 |
|---|---|
| oshi.driver.linux | 提供查询Linux信息的函数 |
| oshi.driver.linux.proc | 提供用于查询Linux / proc伪文件系统中的统计信息的函数 |
| oshi.driver.mac | 提供查询Mac Info的功能 |
| oshi.driver.mac.disk | 提供查询Mac Disk Info的功能 |
| oshi.driver.mac.net | 提供查询MAC网络信息的功能 |
| oshi.driver.unix | 提供用于查询所有UNIX系统通用的信息的功能 |
| oshi.driver.unix.aix | 提供有关AIX的信息的函数 |
| oshi.driver.unix.aix.perfstat | 使用libperfstat API提供有关AIX的信息查询信息的功能 |
| oshi.driver.unix.freebsd | 提供查询FreeBSD信息的函数 |
| oshi.driver.unix.freebsd.disk | 提供查询FreeBSD磁盘信息的函数 |
| oshi.driver.unix.openbsd.disk | 提供查询OpenBSD信息的函数 |
| oshi.driver.unix.solaris | 提供查询Solaris信息的功能 |
| oshi.driver.unix.solaris.disk | 提供查询Solaris磁盘信息的功能 |
| oshi.driver.unix.solaris.kstat | 提供查询Solaris KSTAT信息的函数 |
| oshi.driver.windows | 提供用于在Windows中查询信息的函数 |
| oshi.driver.windows.perfmon | 提供用于在Windows性能监视器(或WMI计数器表中)中查询计数器的功能 |
| oshi.driver.windows.registry | 提供用于在Windows注册表中查询数据的函数 |
| oshi.driver.windows.wmi | 提供函数以在WMI类中查询属性 |
| oshi.hardware | 提供跨平台实现,以检索CPU,存储器,显示,磁盘,网络接口,电源,传感器和USB设备等硬件信息 |
| oshi.hardware.common | 为公共代码提供抽象类 |
| oshi.hardware.platform.linux | 提供有关Linux系统上的内存,电源和处理器等硬件的信息 |
| oshi.hardware.platform.mac | 提供有关Mac系统上的内存,电源和处理器等硬件的信息 |
| oshi.hardware.platform.unix | 为基于UNIX的操作系统提供映射 |
| oshi.hardware.platform.unix.aix | 提供关于AIX系统上的内存,电源和处理器等硬件的信息 |
| oshi.hardware.platform.unix.free | 提供有关内存,电源和FreeBSD系统上的处理器等硬件的信息 |
| oshi.hardware.platform.unix.open | 提供有关OpenBSD系统上的内存,电源和处理器等硬件的信息 |
| oshi.hardware.platform.unix.sola | 提供有关Solaris系统上的内存,电源和处理器等硬件的信息 |
| oshi.hardware.platform.windows | 提供有关Windows系统上的内存,电源和处理器等硬件的信息 |
| oshi.jna.platform.linux | 为Linux提供JNA库的扩展 |
| oshi.jna.platform.mac | 为MacOS提供JNA库的扩展 |
| oshi.jna.platform.unix | 为UNIX提供JNA库的扩展 |
| oshi.jna.platform.windows | 为Windows提供JNA库的扩展 |
| oshi.software.common | 为公共代码提供抽象类 |
| oshi.software.os | 提供跨平台实现来检索OS、文件系统和处理信息 |
| oshi.software.os.linux | 提供有关Linux上的软件和操作系统的信息 |
| oshi.software.os.mac | 提供有关MacOS上的软件和操作系统的信息 |
| oshi.software.os.unix.aix | 提供有关AIX上的软件和操作系统的信息 |
| oshi.software.os.unix.freebsd | 提供有关FreeBSD上的软件和操作系统的信息 |
| oshi.software.os.unix.openbsd | 提供有关OpenBSD上的软件和操作系统的信息 |
| oshi.software.os.unix.solaris | 提供有关Solaris上的软件和操作系统的信息 |
| oshi.software.os.windows | 提供有关Windows上的软件和操作系统的信息 |
| oshi.util | 提供解析、格式化和其他访问的实用程序 |
| oshi.util.platform.linux | 为Linux提供实用程序 |
| oshi.util.platform.mac | 提供Mac的实用程序。 |
| oshi.util.platform.unix.freebsd | 为FreeBSD提供实用程序 |
| oshi.util.platform.unix.openbsd | 为OpenBSD提供实用程序 |
| oshi.util.platform.unix.solaris | 为Solaris提供实用程序 |
| oshi.util.platform.windows | 为Windows提供实用程序 |
| oshi.util.tuples | 提供封装多个对象的类,旨在从方法中作为返回类型 |
1.4 涉及的核心类
| 方法 | 说明 |
|---|---|
| getOperatingSystem() | 获取操作系统信息 |
| getHardware() | 获取硬件信息 |
| getCurrentPlatform() |
SystemInfo systemInfo = new SystemInfo();
二、操作系统信息:OperatingSystem
2.1 总揽
操作系统(OS)是计算机上的软件,该软件管理不同程序使用其硬件的方式,并调节用户控制计算机的方式。
| 方法 | 说明 |
|---|---|
| getBitness() | 操作系统位数 |
| **getChildProcesses(int var1, int var2, OperatingSystem.ProcessSort var3) ** | 获取子进程 |
| getCurrentProcess() | |
| getCurrentThread() | |
| getDesktopWindows(boolean visibleOnly) | 有关操作系统GUI桌面上窗口的信息 |
| getFamily() | 获取操作系统名称,例如 Windows |
| getManufacturer() | 获取供货商,例如 Microsoft |
| getFileSystem() | 获取系统硬盘信息 |
| getInternetProtocolStats() | |
| getNetworkParams() | 获取网络相关参数 |
| getProcess(int pId) | 通过进程id 获取一个进程信息 |
| getProcessCount() | 获取进程数量 |
| **getProcesses(Collection pId) ** | 获取多个进程信息 |
| **getProcesses(int pId, OperatingSystem.ProcessSort var2) ** | 通过进程id获取进程信息,并设置排序方式 |
| getProcessId() | 获取进程id |
| getServices() | 系统服务信息 |
| getSystemBootTime() | 系统启动的大致时间 |
| getSystemUptime() | 操作系统结束时间 |
| getThreadCount() | 获取线程数 |
| getThreadId() | |
| getVersionInfo() | 获取操作系统版本详细信息信息 |
| getSessions() | 有关当前登录到操作系统的用户的信息 |
OperatingSystem operatingSystem = new SystemInfo().getOperatingSystem();
2.2 文件系统信息:FileSystem
OperatingSystem operatingSystem = new SystemInfo().getOperatingSystem();
FileSystem fileSystem = operatingSystem.getFileSystem();
文件系统是一种逻辑安排,通常在分层树中,其中文件被放置用于存储和检索。
| 类名 | 方法 | 说明 |
|---|---|---|
| FileSystem | ||
| getMaxFileDescriptors() | 最大文件描述符 | |
| getOpenFileDescriptors() | 打开文件描述符 | |
| getFileStores() | 获取盘符相关信息 | |
| OSFileStore | ||
| getDescription | 说明 | |
| getFreeInodes | ||
| getFreeSpace | ||
| getLabel | 标签 | |
| getLogicalVolume | 文件系统的逻辑卷名 | |
| getMount | 文件系统的挂载点 | |
| getName | 磁盘名称 | |
| getOptions | 文件系统的选项 | |
| getTotalInodes | ||
| getTotalSpace | 总大小 | |
| getType | 盘符类型 | |
| getUsableSpace | 剩余大小 | |
| getUUID | ||
| getVolume | 文件系统的卷名 | |
| updateAttributes |
2.3 网络参数信息:NetworkParams
| 方法 | 说明 |
|---|---|
| getDnsServers() | 获取域名地址 |
| getHostName() | 获取主机名 |
| getDomainName() | 获取域名 |
| getIpv4DefaultGateway() | 获取默认Ipv4 |
| getIpv6DefaultGateway() | 获取默认Ipv6 |
OperatingSystem operatingSystem = new SystemInfo().getOperatingSystem();
NetworkParams networkParams = operatingSystem.getNetworkParams();
2.4 进程信息:OSProcess
| 方法 | 说明 |
|---|---|
| getName() | 获取进程名称 |
| getPath() | 获取进程所在位置 |
| getCommandLine() | 获取命令行 |
| getCurrentWorkingDirectory() | 获取当前工作目录 |
| getUser() | 获取用户信息 |
| getUserID() | 获取用户id |
| getGroup() | 获取组信息 |
| getGroupID() | 获取组id |
| getState() | 状态 |
| getProcessID() | 获取进程id |
| getParentProcessID() | 获取父进程id |
| getThreadCount() | 获取线程数 |
| getPriority() | 优先级 |
| getVirtualSize() | 虚拟大小 |
| getResidentSetSize() | 实际使用物理内存 |
| getKernelTime() | 内核时间 |
| getUserTime() | 用户时间 |
| getUpTime() | 正常运行时间 |
| getStartTime() | 开始时间 |
| getBytesRead() | 读取字节 |
| getBytesWritten() | 写入字节 |
| getOpenFiles() | 打开文件数量 |
/*** 获取进程信息*/
public static Map<String, Object> getProcessesInfo() {OperatingSystem operatingSystem = new SystemInfo().getOperatingSystem();HardwareAbstractionLayer hardware = new SystemInfo().getHardware();GlobalMemory globalMemory = hardware.getMemory();Map<String, Object> processesInfoMap = new ConcurrentHashMap<>();processesInfoMap.put("processCount", operatingSystem.getProcessCount());processesInfoMap.put("threadCount", operatingSystem.getThreadCount());List<OSProcess> osProcessList = operatingSystem.getProcesses(OperatingSystem.ProcessFiltering.ALL_PROCESSES, OperatingSystem.ProcessSorting.CPU_DESC, 100);List<Map<String, Object>> osProcessMapList = new ArrayList<>(osProcessList.size());for (int i = 0; i < osProcessList.size(); i++) {OSProcess osProcess = osProcessList.get(i);Map<String, Object> osProcessMap = new ConcurrentHashMap<>();osProcessMap.put("index", i);// 进程idosProcessMap.put("id", osProcess.getProcessID());// 父进程idosProcessMap.put("pid", osProcess.getParentProcessID());// 状态osProcessMap.put("state", osProcess.getState().name());// 命令行osProcessMap.put("commandLine", osProcess.getCommandLine());// 内核时间osProcessMap.put("kernelTime", osProcess.getKernelTime());// 用户时间osProcessMap.put("userTime", osProcess.getUserTime());// 正常运行时间osProcessMap.put("upTime", osProcess.getUpTime());// 开始时间osProcessMap.put("startTime", osProcess.getStartTime());// 读取字节osProcessMap.put("bytesRead", osProcess.getBytesRead());// 写入字节osProcessMap.put("bytesWritten", osProcess.getBytesWritten());// 打开文件数量osProcessMap.put("openFiles", osProcess.getOpenFiles());// 优先级osProcessMap.put("priority", osProcess.getPriority());// 线程数osProcessMap.put("threadCount", osProcess.getThreadCount());// 组信息osProcessMap.put("group", osProcess.getGroup());// 组idosProcessMap.put("groupId", osProcess.getGroupID());// 用户信息osProcessMap.put("user", osProcess.getUser());// 用户idosProcessMap.put("userId", osProcess.getUserID());// 获取当前工作目录osProcessMap.put("currentWorkingDirectory", osProcess.getCurrentWorkingDirectory());// 进程所在位置osProcessMap.put("path", osProcess.getPath());// 虚拟大小osProcessMap.put("virtualMemSize", FormatUtil.formatBytes(osProcess.getVirtualSize()));// 实际使用物理内存osProcessMap.put("residentSetSize", FormatUtil.formatBytes(osProcess.getResidentSetSize()));// 进程名称osProcessMap.put("processName", osProcess.getName());// 进程的命令行参数列表osProcessMap.put("arguments", osProcess.getArguments());// 环境变量osProcessMap.put("environmentVariables", osProcess.getEnvironmentVariables());// cpu 使用率osProcessMap.put("cpuUsageRate", 100d * (osProcess.getKernelTime() + osProcess.getUserTime()) / osProcess.getUpTime());// 内存 使用率osProcessMap.put("memUsageRate", 100d * osProcess.getResidentSetSize() / globalMemory.getTotal());osProcessMap.put("softOpenFileLimit", osProcess.getSoftOpenFileLimit());osProcessMap.put("hardOpenFileLimit", osProcess.getHardOpenFileLimit());osProcessMap.put("processCpuLoadCumulative", osProcess.getProcessCpuLoadCumulative());osProcessMap.put("processCpuLoadBetweenTicks", osProcess.getProcessCpuLoadBetweenTicks(osProcess));osProcessMap.put("bitness", osProcess.getBitness());osProcessMap.put("affinityMask", osProcess.getAffinityMask());osProcessMap.put("minorFaults", osProcess.getMinorFaults());osProcessMap.put("majorFaults", osProcess.getMajorFaults());osProcessMapList.add(osProcessMap);}processesInfoMap.put("osProcessMapList", osProcessMapList);return processesInfoMap;
}
这里提到一个类 OSProcess.State,其是一个内部枚举类,用于表示操作系统进程的状态,定义了以下几种状态:
| 状态值 | 说明 |
|---|---|
| RUNNING | 进程正在运行中 |
| BLOCKED | 进程正在等待某个资源,无法继续执行 |
| WAITING | 进程正在等待某个事件发生,例如I/O操作完成 |
| ZOMBIE | 进程已经结束,但其父进程尚未获取其退出状态信息 |
| TERMINATED | 进程已经正常结束或异常终止 |
除了以上状态外,OSProcess.State 类还定义了一些其他状态。不过,根据不同的操作系统和Java版本,OSProcess.State类中可能还有一些其他状态。
2.5 线程信息:OSThread
在oshi库中,OSThread类表示操作系统线程。它提供了获取与操作系统线程相关的信息的方法。
| 方法 | 说明 |
|---|---|
| getContextSwitches | |
| getKernelTime | |
| getMajorFaults | |
| getMinorFaults | |
| getName | 当前线程的名称 |
| getOwningProcessId | |
| getPriority | 当前线程的优先级 |
| getStartMemoryAddress | |
| getStartTime | |
| getState | 获取当前线程的状态,例如新建、可运行、阻塞等 |
| getThreadCpuLoadBetweenTicks | |
| getThreadCpuLoadCumulative | |
| getThreadId | 当前线程的ID |
| getUpTime | |
| getUserTime | |
| updateAttributes |
三、硬件信息:Hardware
3.1 硬件信息:HardwareAbstractionLayer
3.1.1 总揽
// 获取硬件信息
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
| 方法 | 说明 |
|---|---|
| getComputerSystem() | 获取计算机系统信息 |
| getProcessor() | 获取处理器信息 |
| getMemory() | 获取内存信息 |
| getPowerSources() | 获取电源信息 |
| getDiskStores() | 获取硬件磁盘信息 |
| getNetworkIFs() | 获取网络信息 |
| getDisplays() | 获取显示信息 |
| getSensors() | 获取传感器信息 |
| getUsbDevices(boolean var1) | 获取USB设备信息 |
3.1.2 磁盘信息:HWDiskStore
// 获取硬件信息
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
List<HWDiskStore> diskStores = hardware.getDiskStores();
| 类名 | 属性 | 类型 | 说明 |
|---|---|---|---|
| HWDiskStore | |||
| getName() | 获取名称 | ||
| getModel() | 获取型号 | ||
| getSerial() | 获取序列号 | ||
| getSize() | 获取大小 | ||
| getReads() | 读长 | ||
| getReadBytes() | 读取字节 | ||
| getWrites() | 写长 | ||
| getWriteBytes() | 写入字节 | ||
| getTransferTime() | 获取转移时间 | ||
| getPartitions() | 获取分区 | ||
| getTimeStamp() | 获取时间戳 | ||
| getCurrentQueueLength() | 当前队列长度 | ||
| HWPartition | |||
3.1.3 内存信息:Memory
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
GlobalMemory globalMemory = hardware.getMemory();
VirtualMemory virtualMemory = globalMemory.getVirtualMemory();
List<PhysicalMemory> physicalMemoryList = globalMemory.getPhysicalMemory();
| 类名 | 说明 |
|---|---|
| GlobalMemory | 负责跟踪计算机物理内存(RAM)以及可用虚拟内存使用情况 |
| VirtualMemory | 用于获取虚拟内存的相关信息 |
| PhysicalMemory | 用于获取物理内存的相关信息 |
| 类对象 | 方法 | 类型 | 说明 |
|---|---|---|---|
| GlobalMemory | |||
| getTotal() | long | 获取以字节为单位的实际内存数量 | |
| getAvailable() | long | 获取以字节为单位的当前可用的物理内存量 | |
| getSwapTotal() | long | 获取可用虚拟总内存 | |
| getSwapUsed() | long | 获取已用虚拟总内存 | |
| getVirtualMemory() | |||
| getPhysicalMemory() | List | ||
| VirtualMemory | |||
| getSwapTotal() | long | 用于获取交换空间的总大小 | |
| getSwapUsed() | long | 用于获取已使用的交换空间的大小 | |
| getVirtualMax(); | long | 用于获取系统支持的最大虚拟内存大小 | |
| getVirtualInUse() | long | 用于获取当前正在使用的虚拟内存的大小 | |
| getSwapPagesIn() | long | 于获取最近从硬盘上换入的页面数 | |
| getSwapPagesOut() | long | ||
| PhysicalMemory | |||
| getBankLabel() | String | 用于获取内存条的标签或标识符 | |
| getCapacity() | long | 用于获取物理内存的容量 | |
| getClockSpeed() | long | 用于获取物理内存的时钟速度 | |
| getManufacturer() | String | ||
| getMemoryType() | String |
3.1.4 显卡信息:graphicsCard
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
List<GraphicsCard> graphicsCards = hardware.getGraphicsCards()
| 方法 | 说明 |
|---|---|
| getName() | 名称 |
| getDeviceId() | 设备号 |
| getVendor() | 制造商 |
| getVersionInfo() | 版本信息 |
3.1.5 网络接口信息:NetworkIF
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
List<NetworkIF> networkIFs = hardware.getNetworkIFs();
| 方法 | 说明 |
|---|---|
| getName() | 获取名称 |
| getDisplayName() | 获取显示名称 |
| getMTU() | 获取最大传输单元 |
| getMacaddr() | 获取MAC地址 |
| getIPv4addr() | 获取IPv4 |
| getIPv6addr() | 获取IPv6 |
| getBytesRecv() | 获取接收字节数 |
| getBytesSent() | 获取发送字节数 |
| getPacketsRecv() | 获取接收数据包 |
| getPacketsSent() | 获取发送数据包 |
| getInErrors() | 是否可达,正常 0 |
| getOutErrors() | 响应错误,无错误 0 |
| getSpeed() | 获取速率 |
| getTimeStamp() | 获取时间戳 |
3.1.6 电源信息:PowerSource
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
List<PowerSource> powerSources = hardware.getPowerSources();
| 方法 | 说明 |
|---|---|
| getAmperage() | 安培 |
| getCapacityUnits() | 容量单位 |
| getChemistry() | |
| getCurrentCapacity() | 当前容量 |
| getCycleCount() | 循环次数 |
| getDesignCapacity() | 初始容量 |
| getDeviceName() | 设备名字 |
| getManufactureDate() | 制造日期 |
| getManufacturer() | 制造商 |
| getMaxCapacity() | 电池当前最大容量 |
| getName() | 获取名称 |
| getPowerUsageRate() | 电池使用率 |
| getRemainingCapacityPercent() | 电量剩余百分比 |
| getSerialNumber() | |
| getTemperature() | 当前温度 |
| getTimeRemainingEstimated() | |
| getTimeRemainingInstant() | |
| getVoltage() | 电压 |
| isCharging() | |
| isDischarging() | |
| isPowerOnLine() |
3.1.7 传感器信息:Sensors
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
Sensors sensors = hardware.getSensors();
| 方法 | 说明 |
|---|---|
| getCpuTemperature() | 获取CPU温度 |
| getFanSpeeds() | 获取风扇速度 |
| getCpuVoltage() | 获取CPU电压 |
3.1.8 usb设备信息:UsbDevice
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
List<UsbDevice> usbDevices = hardware.getUsbDevices(true);
| 方法 | 说明 |
|---|---|
| getName() | 获取名称 |
| getVendor() | 获取供应商 |
| getVendorId() | 获取供应商id |
| getProductId() | 获取商品id |
| getSerialNumber() | 获取序列号 |
| getConnectedDevices() | 获取连接设备 |
3.2 CPU信息:CentralProcessor
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
CentralProcessor processor = hardware.getProcessor();
| 类名 | 方法 | 说明 |
|---|---|---|
| CentralProcessor | ||
| getVendor() | 获取供应商 | |
| getName() | 获取cpu名称 | |
| getVendorFreq() | 获取供应商频率 | |
| getProcessorID() | 获取处理器id | |
| getIdentifier() | 获取标识符 | |
| isCpu64bit() | 判断cpu是否为64位的 | |
| getStepping() | 获取cpu步进 | |
| getModel() | 获取型号 | |
| getFamily() | 获取家族 | |
| getSystemCpuLoadBetweenTicks() | 获取cpu负载间隔刻度 | |
| getSystemCpuLoadTicks() | 获取cpu负载刻度 | |
| getSystemCpuLoad() | 获取cpu负载 | |
| getSystemLoadAverage() | 获取cpu平均负载 | |
| getSystemLoadAverage(int var1) | 获取cpu平均负载 | |
| getProcessorCpuLoadBetweenTicks() | 获取处理器cpu负载间隔刻度 | |
| getProcessorCpuLoadTicks() | 获取处理器cpu负载刻度 | |
| getSystemUptime() | 获取正常运行时间 | |
| getLogicalProcessorCount() | 获取逻辑处理器数量 | |
| getPhysicalProcessorCount() | 获取物理处理器数量 | |
| getPhysicalPackageCount() | 获取物理包装数量 | |
| getContextSwitches() | 获取上下文切换数量 | |
| getInterrupts() | 获取中断 | |
| LogicalProcessor | ||
| getNumaNode | NUMA节点 | |
| getPhysicalPackageNumber | 物理包数 | |
| getPhysicalProcessorNumber | 物理处理器数 | |
| getProcessorGroup | 处理器组 | |
| getProcessorNumber | 处理器序号 | |
| PhysicalProcessor | ||
| getEfficiency | 效率 | |
| getIdString | 字符串id | |
| getPhysicalPackageNumber | 物理包数 | |
| getPhysicalProcessorNumber | 物理处理器数 | |
| ProcessorIdentifier | ||
| getFamily | 族 | |
| getIdentifier | 标识符 | |
| getMicroarchitecture | 微架构 | |
| getModel | 型号 | |
| getName | 名称 | |
| getProcessorID | 处理器编号 | |
| getStepping | 步进 | |
| getVendor | cpu供应商 | |
| getVendorFreq | 厂家频率 | |
| isCpu64bit | 是否是64位系统 |
3.3 计算机系统:ComputerSystem
计算机系统代表计算机系统/产品的物理硬件,包括BIOS /固件和主板、逻辑板等。
// 获取硬件信息
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
ComputerSystem computerSystem = hardware.getComputerSystem();
| 属性 | 子属性 | 类型 | 说明 |
|---|---|---|---|
| manufacturer | String | 制造商 | |
| model | String | 型号 | |
| serialNumber | String | 序列号 | |
| Firware | 固件信息 | ||
| name | String | 固件名称 | |
| version | String | 固件版本 | |
| describe | String | 固件描述 | |
| manufacturer | String | 制造商 | |
| releaseDate | String | 发行日期 | |
| Baseboard | 主板信息 | ||
| version | String | 主板版本 | |
| model | String | 模型 | |
| serialNumber | String | 序列号 | |
| manufacturer | String | 制造商 |
四、使用场景
4.1 获取 CPU 信息
想要获取 CPU 信息,就需要CentralProcessor 类(中央处理器)作为参数,oshi库获取CentralProcessor 类步骤为:
-
首先实例化内置的SystemInfo类,该类用于访问系统和硬件信息。
-
然后根据此类的内置方法获取硬件抽象层类 HardwareAbstractionLayer 类,主要用于将硬件抽象化,允许计算机操作系统在逻辑层而不是硬件层与硬件设备交互。
-
最后根据HardwareAbstractionLayer类内置方法获取CentralProcessor 类,提供setCpuInfo方法参数
public static Map<String, Object> getCpuInfo() throws InterruptedException {HardwareAbstractionLayer hardware = new SystemInfo().getHardware();Map<String, Object> cpuInfo = Maps.newHashMap();CentralProcessor processor = hardware.getProcessor();// 第一次获取:获取系统范围的 CPU 负载滴答计数器:long[] prevTicks = processor.getSystemCpuLoadTicks();//等待一段时间java.lang.Thread.sleep(1000);//第二次获取:获取系统范围的 CPU 负载滴答计数器:long[] ticks = processor.getSystemCpuLoadTicks();long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];long ioWait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.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 totalCpu = user + nice + cSys + idle + ioWait + irq + softIrq + steal;// cpu供应商cpuInfo.put("cpuVendor", processor.getProcessorIdentifier().getVendor());// cpu名称cpuInfo.put("cpuName", processor.getProcessorIdentifier().getName());// CPU核心数cpuInfo.put("cpuNum", processor.getLogicalProcessorCount());// CPU总的使用率cpuInfo.put("totalPercent", totalCpu);// CPU用户使用率,表示用户模式下花费的CPU时间cpuInfo.put("usedPercent", new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));// CPU当前等待率,表示等待I/O操作的进程所花费的CPU时间cpuInfo.put("waitPercent", new DecimalFormat("#.##%").format(ioWait * 1.0 / totalCpu));// CPU系统使用率,表示系统进程所花费的CPU时间cpuInfo.put("sysPercent", new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));// CPU当前空闲率,表示空闲进程所花费的CPU时间cpuInfo.put("idlePercent", new DecimalFormat("#.##%").format(idle * 1.0 / totalCpu));// 表示在nice值为0~99之间的进程所花费的CPU时间cpuInfo.put("nicePercent", new DecimalFormat("#.##%").format(nice * 1.0 / totalCpu));// 表示处理中断的进程所花费的CPU时间cpuInfo.put("irqPercent", new DecimalFormat("#.##%").format(irq * 1.0 / totalCpu));// 表示处理软中断的进程所花费的CPU时间cpuInfo.put("softIrqPercent", new DecimalFormat("#.##%").format(softIrq * 1.0 / totalCpu));// 表示被其他线程“偷走”的CPU时间cpuInfo.put("stealPercent", new DecimalFormat("#.##%").format(steal * 1.0 / totalCpu));// 物理处理器数量cpuInfo.put("physicalProcessorCount", processor.getPhysicalProcessorCount());return cpuInfo;
}
4.2 获取内存信息
想要获取内存信息,这就需要硬件抽象层类提供的GlobalMemory类作为参数,通过GlobalMemory类的内置方法来获取内存信息。
public static Map<String, Object> getMemoryInfo() {HardwareAbstractionLayer hardware = new SystemInfo().getHardware();GlobalMemory globalMemory = hardware.getMemory();Map<String, Object> gmMap = Maps.newHashMap();// 总内存gmMap.put("total", FormatUtil.formatBytes(globalMemory.getTotal()));// 剩余【当前可用的物理内存量】gmMap.put("available", FormatUtil.formatBytes(globalMemory.getAvailable()));// 已使用gmMap.put("used", FormatUtil.formatBytes(globalMemory.getTotal() - globalMemory.getAvailable()));// 空闲率gmMap.put("freeRate", 100d * (globalMemory.getAvailable()) / globalMemory.getTotal());// 使用率gmMap.put("usageRate", 100d * (globalMemory.getTotal() - globalMemory.getAvailable()) / globalMemory.getTotal());gmMap.put("pageSize", globalMemory.getPageSize());VirtualMemory virtualMemory = globalMemory.getVirtualMemory();Map<String, Object> vmMap = Maps.newHashMap();vmMap.put("toString", virtualMemory);vmMap.put("swapTotal", FormatUtil.formatBytes(virtualMemory.getSwapTotal()));vmMap.put("swapUsed", FormatUtil.formatBytes(virtualMemory.getSwapUsed()));vmMap.put("swapUsageRate", 100d * virtualMemory.getSwapUsed() / virtualMemory.getSwapTotal());vmMap.put("virtualMax", FormatUtil.formatBytes(virtualMemory.getVirtualMax()));vmMap.put("virtualInUse", FormatUtil.formatBytes(virtualMemory.getVirtualInUse()));vmMap.put("virtualUsageRate", 100d * virtualMemory.getVirtualInUse() / virtualMemory.getVirtualMax());gmMap.put("virtualMemory", vmMap);List<PhysicalMemory> physicalMemoryList = globalMemory.getPhysicalMemory();List<Map<String, Object>> pmInfoList = new ArrayList<>(physicalMemoryList.size());for (PhysicalMemory pm : physicalMemoryList) {Map<String, Object> pmMap = Maps.newHashMap();pmMap.put("toString", String.valueOf(pm));pmMap.put("bankLabel", pm.getBankLabel());pmMap.put("manufacturer", pm.getManufacturer());pmMap.put("capacity", FormatUtil.formatBytes(pm.getCapacity()));pmMap.put("memoryType", pm.getMemoryType());pmMap.put("clockSpeed", FormatUtil.formatHertz(pm.getClockSpeed()));pmInfoList.add(pmMap);}gmMap.put("physicalMemoryList", pmInfoList);return gmMap;
}
4.3 获取服务器信息
首先调用Java内置的System类的 getProperties() 方法,获取当前系统属性集,并作为一个Properties对象返回,并通过对该属性集通过传参查询,得到操作系统名称、系统架构、项目路径等信息。
public static Map<String, Object> getSysInfo() throws UnknownHostException {Map<String, Object> sysInfo = Maps.newHashMap();Properties props = System.getProperties();// 操作系统sysInfo.put("osName", props.getProperty("os.name"));// 系统架构sysInfo.put("osArch", props.getProperty("os.arch"));// 服务器名称sysInfo.put("computerName", InetAddress.getLocalHost().getHostName());// 服务器IPsysInfo.put("computerIp", InetAddress.getLocalHost().getHostAddress());// 项目路径sysInfo.put("userDir", props.getProperty("user.dir"));// 操作系统信息sysInfo.put("desktop", props.getProperty("sun.desktop"));return sysInfo;
}
4.4 获取Java虚拟机信息
首先通过System系统类获取当前系统属性集后,使用Properties对象传参查询的得到JDK版本与路径;通过获得Java内置的RunTime对象(每个Java应用程序都有一个单独的Runtime类实例,它允许应用程序与运行应用程序的环境进行接口。当前运行时可以从getRuntime方法中获得)获取Java虚拟机的总内存量、 Java 虚拟机试图使用的最大内存量、Java虚拟机中的可用内存量。
public static Map<String, Object> getJvmInfo() {Map<String, Object> jvmInfo = new ConcurrentHashMap<>();Properties props = System.getProperties();Runtime runtime = Runtime.getRuntime();long jvmTotalMemoryByte = runtime.totalMemory();long jvmFreeMemoryByte = runtime.freeMemory();long jvmUseMemoryByte = jvmTotalMemoryByte - jvmFreeMemoryByte;// jvm总内存jvmInfo.put("totalMemory", FormatUtil.formatBytes(jvmTotalMemoryByte));// JVM空闲内存jvmInfo.put("freeMemory", FormatUtil.formatBytes(jvmFreeMemoryByte));// Jvm已使用内存jvmInfo.put("usedMemory", FormatUtil.formatBytes(jvmUseMemoryByte));// JVM最大可用内存总数jvmInfo.put("maxMemory", FormatUtil.formatBytes(runtime.maxMemory()));// jvm内存使用率jvmInfo.put("useRate", new DecimalFormat("#.##%").format((jvmUseMemoryByte) * 1.0 / jvmTotalMemoryByte));// jvm内存空闲率jvmInfo.put("freeRate", new DecimalFormat("#.##%").format((jvmFreeMemoryByte) * 1.0 / jvmTotalMemoryByte));// Java版本jvmInfo.put("jdkVersion", props.getProperty("java.version"));// jdk安装目录jvmInfo.put("jdkHome", props.getProperty("java.home"));// java类包的路径props.getProperty("java.class.path");//java虚拟机制造商props.getProperty("java.vm.vendor");// jdk bin目录props.getProperty("sun.boot.library.path");// java运行环境版本props.getProperty("java.runtime.version");// 依赖路径props.getProperty("java.library.path");// java制造商props.getProperty("java.vendor");// java虚拟机信息props.getProperty("java.vm.info");// java虚拟机版本props.getProperty("java.vm.version");// java类版本props.getProperty("java.class.version");return jvmInfo;
}
4.5 获取系统文件相关信息
首先通过 SystemInfo类获取当前平台操作系统的新实例,再根据 OperatingSystem.getFileSystem()方法实例化FileSystem对象,再通过 getFileStores() 获取本机上文件存储实例化OSFileStore对象列表,表示存储池、设备、分区、卷、具体的文件系统或其他实现特定的文件存储方法信息,该方法会返回OSFileStore对象列表。最后遍历此集合获取磁盘状态信息。
public static Map<String, Object> getFileSystemInfo() {Map<String, Object> fsInfo = new ConcurrentHashMap<>();FileSystem fileSystem = new SystemInfo().getOperatingSystem().getFileSystem();List<Map<String, Object>> fileSystemInfos = new ArrayList<>();// 打开文件描述符fsInfo.put("openFileDescriptors", fileSystem.getOpenFileDescriptors());// 最大文件描述符fsInfo.put("maxFileDescriptors", fileSystem.getMaxFileDescriptors());fsInfo.put("fileDescriptors", String.format("%d/%d", fileSystem.getOpenFileDescriptors(), fileSystem.getMaxFileDescriptors()));fsInfo.put("fdUsageRate", (100d * fileSystem.getOpenFileDescriptors() / fileSystem.getMaxFileDescriptors()) + "%");List<OSFileStore> fileStores = fileSystem.getFileStores();for (int i = 0; i < fileStores.size(); i++) {Map<String, Object> fileStoreInfo = Maps.newHashMap();fileStoreInfo.put("index", i);OSFileStore osFileStore = fileStores.get(i);// 磁盘名称fileStoreInfo.put("name", osFileStore.getName());// 文件系统的卷名fileStoreInfo.put("volume", osFileStore.getVolume());// 标签fileStoreInfo.put("label", osFileStore.getLabel());// 文件系统的逻辑卷名fileStoreInfo.put("logicalVolume", osFileStore.getLogicalVolume());// 文件系统的挂载点fileStoreInfo.put("mount", osFileStore.getMount());// 说明fileStoreInfo.put("description", osFileStore.getDescription());// 盘符类型fileStoreInfo.put("sysTypeName", osFileStore.getType());// 文件系统的选项fileStoreInfo.put("options", osFileStore.getOptions());fileStoreInfo.put("uuid", osFileStore.getUUID());fileStoreInfo.put("freeSpace", osFileStore.getFreeSpace());// 剩余大小fileStoreInfo.put("usableSpace", FormatUtil.formatBytes(osFileStore.getUsableSpace()));// 总大小fileStoreInfo.put("totalSpace", FormatUtil.formatBytes(osFileStore.getTotalSpace()));fileStoreInfo.put("freeInodes", FormatUtil.formatValue(osFileStore.getFreeInodes(), ""));fileStoreInfo.put("totalInodes", FormatUtil.formatValue(osFileStore.getTotalInodes(), ""));// 已经使用量fileStoreInfo.put("usedSpace", FormatUtil.formatBytes(osFileStore.getTotalSpace() - osFileStore.getUsableSpace()));// 使用率String usageRate = "0";if (osFileStore.getTotalSpace() > 0) {usageRate = new DecimalFormat("#.##%").format((osFileStore.getTotalSpace() - osFileStore.getUsableSpace()) * 1.0 / osFileStore.getTotalSpace());}fileStoreInfo.put("usageRate", usageRate);fileStoreInfo.put("inodesUsageRate", 100d * osFileStore.getFreeInodes() / osFileStore.getTotalInodes());fileSystemInfos.add(fileStoreInfo);}fsInfo.put("fileStores", fileSystemInfos);return fsInfo;
}
4.6 获取磁盘信息
public static List<Map<String, Object>> getDiskStoreInfo() {HardwareAbstractionLayer hardware = new SystemInfo().getHardware();List<HWDiskStore> diskStores = hardware.getDiskStores();List<Map<String, Object>> dsList = new ArrayList<>(diskStores.size());for (int i = 0; i < diskStores.size(); i++) {HWDiskStore hwDiskStore = diskStores.get(i);Map<String, Object> hwDsMap = new ConcurrentHashMap<>();hwDsMap.put("index", i);// 磁盘名称hwDsMap.put("name", hwDiskStore.getName());hwDsMap.put("currentQueueLength", hwDiskStore.getCurrentQueueLength());// 型号hwDsMap.put("model", hwDiskStore.getModel());// 序列号hwDsMap.put("serial", hwDiskStore.getSerial());// 大小hwDsMap.put("size", FormatUtil.formatBytes(hwDiskStore.getSize()));// 读长hwDsMap.put("reads", FormatUtil.formatBytes(hwDiskStore.getReads()));// 写长hwDsMap.put("writes", FormatUtil.formatBytes(hwDiskStore.getWrites()));// 读取字节hwDsMap.put("readBytes", hwDiskStore.getReadBytes());// 写入字节hwDsMap.put("writeBytes", hwDiskStore.getWriteBytes());// 转移时间hwDsMap.put("transferTime", hwDiskStore.getTransferTime());// 时间戳hwDsMap.put("timeStamp", hwDiskStore.getTimeStamp());List<HWPartition> partitions = hwDiskStore.getPartitions();List<Map<String, Object>> partitionList = new ArrayList<>(partitions.size());for (HWPartition partition : partitions) {Map<String, Object> partitionMap = Maps.newHashMap();// 分区大小partitionMap.put("size", FormatUtil.formatBytes(partition.getSize()));// 分区名称partitionMap.put("name", partition.getName());// 分区类型partitionMap.put("type", partition.getType());partitionMap.put("identification", partition.getIdentification());partitionMap.put("major", partition.getMajor());partitionMap.put("uuid", partition.getUuid());partitionMap.put("mountPoint", partition.getMountPoint());partitionMap.put("minor", partition.getMinor());partitionList.add(partitionMap);}hwDsMap.put("partitionList", partitionList);dsList.add(hwDsMap);}return dsList;
}
小结
把今天最好的表现当作明天最新的起点..~
投身于天地这熔炉,一个人可以被毁灭,但绝不会被打败!一旦决定了心中所想,便绝无动摇。迈向光明之路,注定荆棘丛生,自己选择的路,即使再荒谬、再艰难,跪着也要走下去!放弃,曾令人想要逃离,但绝境重生方为宿命。若结果并非所愿,那就在尘埃落定前奋力一搏!
相关文章:
OSHI-操作系统和硬件信息库
文章目录 引言一、快速入门1.1 OSHI的简介1.2 引入依赖1.3 涉及的包(package)1.4 涉及的核心类 二、操作系统信息:OperatingSystem2.1 总揽2.2 文件系统信息:FileSystem2.3 网络参数信息:NetworkParams2.4 进程信息&am…...
基于Java SSM框架+Vue实现企业公寓后勤管理系统项目【项目源码+论文说明】计算机毕业设计
基于java的SSM框架Vue实现企业宿舍后勤管理网站演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所…...
stm32mp157和imx6ull在设备树节点上设置ap3216c的主要区别
stm32mp157和imx6ull在设备树节点上设置ap3216c的主要区别是,它们使用的不同的硬件架构和不同的设备树格式。以下是两者之间的差异: 硬件架构:stm32mp157是基于ARM Cortex-M4内核的微控制器,而imx6ull则是基于ARM Cortex-A7内核的…...
网工学习6-配置和管理 VLAN
6.1VLAN概念 1> 什么是 VLAN? VLAN 是一种在交换机上划分逻辑网段的二层技术。 2> 为什么要通过交换机划分网段? ① 因为交换机的端口密度比路由器高,并且价格比路由器低,所以组网成本更低。 ② 因为交换机划分网段比…...
MySQL库与表的备份
库的备份 备份 语法 mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径 例 mysqldump -P3306 -u root -p123456 -B mytest > D:/mytest.sql 注意 这是在linux命令行下。 还原 语法 scource 数据库文件路径 例 source D:/mysql-5.7.22/mytest.s…...
Python核心编程之基础内功
目录 一、语句和语法 1、 注释( # ) 2、继续( \ ) 3、多个语句构成代码组(:):...
GPT4-Turbo技术原理研发现状及未来应用潜力分析报告
今天分享的是GPT4-Turb系列深度研究报告:《GPT4-Turbo技术原理研发现状及未来应用潜力分析报告》。 (报告出品方:深度行业分析研究) 报告共计:46页 图像理解能力提升:三大视觉学习方法 为打造视觉大模…...
为什么 SQL 不适合图数据库
背景 “为什么你们的图形产品不支持 SQL 或类似 SQL 的查询语言?” 过去,我们的一些客户经常问这个问题,但随着时间的推移,这个问题变得越来越少。 尽管一度被忽视,但图数据库拥有无缝设计并适应其底层数据结构的查询…...
【Rust日报】2023-12-02 深度学习框架 Burn 发布 v0.11.0
深度学习框架 Burn 发布 v0.11.0 深度学习框架 Burn 发布 v0.11.0,新版本引入了自动内核融合(Kernel Fusion)功能,大大提升了访存密集型(memory-bound)操作的性能。同时宣布成立 Tracel AI (https://tracel…...
MySQL性能调优-1-实际优化案例
关于SQL优化的思路,一般都是使用执行计划看看是否用到了索引,主要可能有两大类情况: 对业务字段建立了二级联合索引,但是MySQL错误地觉得走主键聚族索引全表扫描效率更高,而没有走二级索引 走二级索引,但…...
JavaScript空值合并运算符
The Nullish Coalescing Operator(空值合并运算符)是一种 JavaScript 的新运算符,用于解决默认值设定中存在的一些问题。它的语法为 ??(两个问号),表示当左侧的操作数为 null 或 undefined 时,…...
Spring Boot 集成 spring security 01
一、导入依赖(pom.xml) <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…...
C 编程中使用字符串
理解字符串: C 中的字符串是使用字符数组来操作的。数组中的每个字符对应字符串的一个元素,字符串的结尾由空字符(\0)标记。这个空字符至关重要,因为它表示字符串的结尾,并允许函数确定字符串在内存中的结…...
【GD32307E-START】04 使用TinyMaix进行手写数字识别
【GD32307E-START】04 使用TinyMaix进行手写数字识别 参考博客 【GD32F427开发板试用】使用TinyMaix进行手写数字识别 https://blog.csdn.net/weixin_47569031/article/details/129009839 软硬件平台 GD32F307E-START Board开发板GCC Makefile TinyMaix简介 TinyMaix是国…...
qt-C++笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解
qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解 code review! 文章目录 qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解1.示例运行2.event->pos();详解3.event->pos()的坐标系原点4.Qt中的坐标系详解5.QMainWindow::mousePressEvent(event);详解 1.示例…...
小程序开发平台源码系统:搭建新的商业体系 附带完整的搭建教程
小程序开发平台源码系统是在移动互联网快速发展的背景下诞生的。随着微信小程序的普及,越来越多的人开始关注小程序的开发与运营。然而,对于很多初学者和小型企业来说,开发一个小程序需要专业的技术知识和大量的时间投入,这无疑是…...
css3新增的伪类有哪些?
CSS3新增的伪类有: :first-of-type,选择属于其父元素的特定类型的第一个子元素。:last-of-type,选择属于其父元素的特定类型的最后一个子元素。:only-of-type,选择属于其父元素的特定类型的唯一子元素。:only-child,选…...
开源软件license介绍与检测
开源License介绍 通俗来讲,开源许可证就是一种允许软件使用者在一定条件内按照需要自由使用和修改软件及其源代码的的法律条款。借此条款,软件作者可以将这些权利许可给使用者,并告知使用限制。这些许可条款可以由个人、商业公司或非赢利组织…...
【LeeCode】142.环形链表II
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数…...
nodejs微信小程序+python+PHP健身房信息管理系统的设计与实现-计算机毕业设计推荐
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
