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

news2024/11/25 23:33:17

在这里插入图片描述

文章目录

  • 引言
  • 一、快速入门
    • 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 涉及的核心类

SystemInfo
操作系统信息
OperatingSystem
硬件信息
Hardware
平台信息
Platform
方法说明
getOperatingSystem()获取操作系统信息
getHardware()获取硬件信息
getCurrentPlatform()
SystemInfo systemInfo = new SystemInfo();

二、操作系统信息:OperatingSystem

2.1 总揽

OperatingSystem
OSProcess
OSThread
OSDesktopWindow
FileSystem
InternetProtocolStats
NetworkParams
OSService
OSSession
OSVersionInfo

操作系统(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();
OperatingSystem
FileSystem
OSFileStore

文件系统是一种逻辑安排,通常在分层树中,其中文件被放置用于存储和检索。

类名方法说明
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);
        // 进程id
        osProcessMap.put("id", osProcess.getProcessID());
        // 父进程id
        osProcessMap.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());
        // 组id
        osProcessMap.put("groupId", osProcess.getGroupID());
        // 用户信息
        osProcessMap.put("user", osProcess.getUser());
        // 用户id
        osProcessMap.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
显卡
GraphicsCard
内存
Memory
传感器
Sensors
磁盘存储
HWDiskStore
电源
PowerSource
网卡
NetworkIF
声卡
SoundCard
显示器
Display
// 获取硬件信息
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
分区
HWPartition
类名属性类型说明
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();
内存信息:Memory
GlobalMemory
VirtualMemory
PhysicalMemory
类名说明
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

CentralProcessor
LogicalProcessor
PhysicalProcessor
ProcessorIdentifier
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
getNumaNodeNUMA节点
getPhysicalPackageNumber物理包数
getPhysicalProcessorNumber物理处理器数
getProcessorGroup处理器组
getProcessorNumber处理器序号
PhysicalProcessor
getEfficiency效率
getIdString字符串id
getPhysicalPackageNumber物理包数
getPhysicalProcessorNumber物理处理器数
ProcessorIdentifier
getFamily
getIdentifier标识符
getMicroarchitecture微架构
getModel型号
getName名称
getProcessorID处理器编号
getStepping步进
getVendorcpu供应商
getVendorFreq厂家频率
isCpu64bit是否是64位系统

3.3 计算机系统:ComputerSystem

计算机系统代表计算机系统/产品的物理硬件,包括BIOS /固件和主板、逻辑板等。

// 获取硬件信息
HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
ComputerSystem computerSystem = hardware.getComputerSystem();
ComputerSystem
固件信息
Firmware
主板信息
Baseboard
属性子属性类型说明
manufacturerString制造商
modelString型号
serialNumberString序列号
Firware固件信息
nameString固件名称
versionString固件版本
describeString固件描述
manufacturerString制造商
releaseDateString发行日期
Baseboard主板信息
versionString主板版本
modelString模型
serialNumberString序列号
manufacturerString制造商

四、使用场景

4.1 获取 CPU 信息

  想要获取 CPU 信息,就需要CentralProcessor 类(中央处理器)作为参数,oshi库获取CentralProcessor 类步骤为:

  1. 首先实例化内置的SystemInfo类,该类用于访问系统和硬件信息。

  2. 然后根据此类的内置方法获取硬件抽象层类 HardwareAbstractionLayer 类,主要用于将硬件抽象化,允许计算机操作系统在逻辑层而不是硬件层与硬件设备交互。

  3. 最后根据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());
    // 服务器IP
    sysInfo.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;
}

小结

把今天最好的表现当作明天最新的起点..~

  投身于天地这熔炉,一个人可以被毁灭,但绝不会被打败!一旦决定了心中所想,便绝无动摇。迈向光明之路,注定荆棘丛生,自己选择的路,即使再荒谬、再艰难,跪着也要走下去!放弃,曾令人想要逃离,但绝境重生方为宿命。若结果并非所愿,那就在尘埃落定前奋力一搏!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1267588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2023年APMCM亚太杯C题】完整代码+结果分析+论文框架(二)

2023年APMCM亚太杯C题 3、4问 问题三问题分析技术文档基于相关性分析的汽车产业影响分析3.1 分布检验模型的建立3.2 相关性模型的建立3.3 模型求解 问题四问题分析技术文档4 基于 Kruskal-Wallis H 检验的政策影响研究4.1 分布检验模型的建立4.2 方差齐性检验模型的建立4.3 Kru…

软件测试人员如何快速成长?

文章标题有点大&#xff0c;更贴切的描述应该是测试人员如何在工作中快速积累经验和提高技能。但是这么描述太长了&#xff0c;根据自己的工作经验和经历&#xff0c;谈一些个人观点。 在这我也准备了一份软件测试视频教程&#xff08;含接口、自动化、性能等&#xff09;&…

EXCEL小技巧, 用2种公式方法,查找1列数据里符合条件的最后1个单元格

目录 1 问题 2 解决办法 3 lookup()变形公式&#xff0c; lookup(1,0/((列1条件1)*(列2条件2)) 3.1 公式用法 3.2 局限性 4 数组公式&#xff0c;INDEX(H:H,MAX(IF(I:IK4,ROW(H:H)))) 4.1 语法 1问题 一般来说&#xff0c;EXCEL里使用 match()等只能查到符合条件的第一…

作为用户,推荐算法真的是最优解么?

前言 众所周知&#xff0c;随着互联网技术的发展&#xff0c;推荐算法也越来越普及。无论是购物网站、社交媒体平台还是在线影视平台&#xff0c;推荐算法已成为用户获取相关信息的主要途径。据悉&#xff0c;近期GitHub决定结合算法推荐&#xff0c;将“Following”和“For Yo…

Django连接数据库

连接数据库 接下来讲的几个步骤不需要区分先后&#xff0c;但都得进行操作 settings.py的操作 #!settings.py ....别的代码DATABASES {default: { ENGINE: django.db.backends.mysql, NAME: day1121, # 数据库名字&#xff0c;要先创建好 USER: root, PASSWORD: 123456, HO…

解决Unable to preventDefault inside passive event listener invocation.报错

报错信息&#xff1a; 这个报错大致说的是&#xff1a;无法在被动事件侦听器调用中防止Default 查了其他博主的解决办法&#xff1a;比如&#xff1a; 1、声明事件监听的时候设置为主动事件监听&#xff1a; window.addEventListener(‘touchmove’, handler, { passive: fal…

【方法】PowerPoint如何删除“限制编辑”?

如果PPT文件设置成“只读模式”&#xff0c;就会被限制编辑&#xff0c;也就是无法对PPT进行编辑或更改&#xff0c;那要如何删除这个“限制”呢&#xff1f; 下面小编会按照“无密码的只读方式”、“有密码的只读方式”以及“忘记了密码的只读方式”这3种情况&#xff0c;来说…

LabVIEW使用软件定义进行汽车电子测试

LabVIEW使用软件定义进行汽车电子测试 电子元件的逻辑和稳健性一直都是需要评估的对象。过去&#xff0c;汽车仅使用几种电子元件来执行简单的功能&#xff0c;每个元件都是在专门准备的环境中单独进行的。但随着电子元件日益多样化&#xff0c;且功能日益复杂&#xff0c;这种…

Vue修改密码功能的源代码

基本需求 输入框不能为空 旧密码表单提交时必须正确 两次输入新密码一致 限定新密码的复杂度&#xff0c;这里是长度在 6 到 20 个字符 <template><el-form ref"form" :model"user" :rules"rules" label-width"80px"><…

postgres在docker中使用

记录个人开发过程中postgres在docker中的使用&#xff0c;以便后续查看。 Dockerfile 个人是在M1电脑上开发&#xff0c;所以platform使用linux/amd64来兼容amd芯片。 FROM --platformlinux/amd64 postgres:16.1-alpine COPY ./poetrydb.sql /docker-entrypoint-initdb.d/po…

Jira Software最新版本(9.11.2)安装

软件获取 Jira Software 历史版本下载地址&#xff1a;Jira Server 下载存档 | Atlassian Atlassian-agent.jar https://github.com/haxqer/confluence/releases/download/v1.3.3/atlassian-agent.jar MySQL 驱动包 MySQL :: Download MySQL Connector/J (Archived Versio…

用Sublime编写Lua脚本

大家好&#xff0c;我是阿赵。   现在很多手游项目使用lua作为热更新的代码脚本&#xff0c;我一直很喜欢用Sublime来写lua程序。喜欢使用它的原因是它的轻量化&#xff0c;因为我经常要同时打开多个项目&#xff0c;Unity和VisualStudio这些软件都比较占用电脑的性能&#x…

Pycharm修改文件默认打开方式 + CSV Editor插件使用

1、File —> Settings —> Editor —> File Types 然后将*csv添加到最上面 在plugins中下载插件&#xff0c;CSV Editor 备注&#xff1a;不在上一步的“File Types”中将*.csv设置为CSV格式&#xff0c;插件是不起作用的 就可以使用了

微服务学习|初识elasticsearch、操作索引库、文档操作、RestClient操作索引库、RestClient操作文档

初识elasticsearch 什么是elasticsearch&#xff1f; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack (ELK)。被广泛应用在日志数据分析、实…

图书管理系统源码,图书管理系统开发,图书借阅系统源码配置和运行图解源码已附加

目录 配置简介和软件条件 数据库附件配置 vs应用程序web.config配置数据库链接字符串 数据库文件脚本代码 配置简介和软件条件 所需要的软件是Vs2017以上数据库是Sqlserver2012以上&#xff0c;如果数据库附件不了可以使用数据库脚本附件数据库脚本会在文章末尾写出来。可以…

TableAgent:首个国产可私有部署的企业级Code Interpreter

TableAgent公测地址&#xff1a;https://tableagent.DataCanvas.com 数字化时代&#xff0c;数据分析的重要性犹如空气般无处不在。商业数据分析是数字化管理、智能决策的基础&#xff0c;同时数据分析又是一个专业性极强的工作&#xff0c;描述性分析、诊断性分析、预测性分…

【经验贴】技术转项目经理,利用项目管理工具快速适应!

之前分享了我在项目管理过程中的一些实战经验&#xff0c;大家纷纷表示感同身受。其中&#xff0c;有一部分技术转项目经理岗位的小伙伴吐槽现在加的班比以前更多、工作更难开展了&#xff0c;想问问如何能快速适应新的工作岗位。 我们公司这几年随着业务的不断增加&#xff0c…

docker搭建rabbit集群

1.去rabbitMQ官网拉去images 我当前使用的是最新版本的镜像&#xff1a;rabbitmq:3.12-management 2.创建一个集群专用网络 docker的容器相互隔离是不可通信的&#xff0c;我们自行创建一个网络后&#xff0c;创建容器时 给他们放在一起&#xff0c;就可以通信了。 docker netw…

Testlink 1.9.20+phpstudy_pro安装遇到的问题

phpstudy_pro启动了Apache2.4.39和Mysql5.7.26,php的版本是7.3.4zai。 安装Testlink 1.9.19时没有数据库的问题&#xff0c;安装Testlink 1.9.20时遇到了数据库问题&#xff0c;如下图所示&#xff1a; 网上搜索“Failed!Mysql Database cannnot be used”&#xff0c;给出的…

Adobe Illustrator绘图解决卡顿问题

最近在用AI做矢量图&#xff0c;但是遇到了一个很难搞的问题&#xff0c;当我们需要分辨率较高的图片的时候&#xff0c;Python用Matplotlib生成的pdf时dpi参数会设置为600及以上&#xff0c;但是样子的话就造成了pdf文件过大以及AI卡顿&#xff0c;比如&#xff0c;下午生成的…