| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| oshi-dist-7.6.0.zip | 2026-08-23 | 5.3 MB | |
| README.md | 2026-08-23 | 8.0 kB | |
| Release 7.6.0 source code.tar.gz | 2026-08-23 | 2.9 MB | |
| Release 7.6.0 source code.zip | 2026-08-23 | 3.9 MB | |
| Totals: 4 Items | 12.1 MB | 0 | |
Maven Central Publication Change
The oshi-dist zip is no longer published to Maven Central; download it from the GitHub release instead.
New Features
- #3652:
oshi-metricsreports the OpenTelemetryreservedstate forsystem.filesystem.usageandsystem.filesystem.utilization, alongside the existingusedandfree. The three states partition the filesystem, so theusagegauges sum tosystem.filesystem.limitand theutilizationgauges sum to 1.0 - @dbwiddis. - #3660,
#3678:
Display.getDevicePort()reports the port a display is attached to, and on systems with X RandR,Display.getOutputName()gives the namexrandr --outputaccepts for it - @ayonization, @dbwiddis.
Behavior Changes
- #3705:
OSDesktopWindow.getLocAndSize()returns a copy of the window'sRectangleand the constructor copies the one it is given, so the class honors the immutability its documentation promises.ApplicationInfo.getAdditionalInfo()returns an unmodifiable map. Code that wrote through either return value silently mutated OSHI's own state; it now has no effect, or throwsUnsupportedOperationExceptionfor the map - @dbwiddis. - #3705:
UsbDevice.compareTo()breaks ties on the unique device ID, vendor ID, product ID and serial number after comparing names, andAbstractUsbDeviceimplementsequals()andhashCode()over the same fields. Two distinct devices sharing a name previously compared equal, so aTreeSetorSortedSetof them kept only one. The ordering is now a default method onUsbDevice, so every implementation shares it - @dbwiddis.
Bug Fixes and Improvements
- #3651:
OSFileStorenow guarantees0 <= getUsableSpace() <= getFreeSpace() <= getTotalSpace()on every platform. The three values are read by separate queries, so on a ZFS dataset or a swap-backedtmpfsthey could previously contradict each other; they are now clamped downward to restore the ordering - @dbwiddis. - #3657: Fix the
TcpStatefor the FFM implementation ofInternetProtocolStats.getConnections()on macOS and set the process cap from the kernel - @dbwiddis. - #3661: Setting
oshi.os.windows.hkeyperfdatatofalsenow also skips the registry when fetching thread counters, matching its documented behavior and the existing handling for processes - @dbwiddis. - #3662: Reading the processor description from the registry no longer throws when a value is missing.
CentralProcessor.getFeatureFlags()on Windows now reports every processor featureIsProcessorFeaturePresent()accepts, matching thePF_defines inwinnt.h- @dbwiddis. - #3665:
NetworkParams.getRoutes()reads the routing table from the kernel through aNET_RT_DUMPsysctl on macOS, FreeBSD, DragonFly BSD and OpenBSD, rather than by runningnetstattwice - @dbwiddis. - #3670:
NetworkParams.getHostName()on Linux reads the kernel host name from/proc/sys/kernel/hostnamein every backend, fixing the native-free implementation, which truncated a fully qualified name at the first dot and reportedlocalhostwhen the name did not resolve - @dbwiddis. - #3671:
NetworkParams.getHostName()andgetDomainName()report the empty-string sentinel when the local host name does not resolve, rather than the loopback address'slocalhost. NetBSD is the most affected platform, having no native host name query of its own - @dbwiddis. - #3672,
#3674:
CentralProcessorfrequencies andPhysicalProcessor.getEfficiency()on Apple Silicon are correct regardless of call order and on the M4 and M5 generations. Frequencies previously fell back to a 2.4 GHz placeholder unlessgetProcessorIdentifier()happened to be called first, were reported a thousand times too low on the M4 and later, and a chip with more or fewer than two kinds of core was misclassified - @dbwiddis. - #3675:
CentralProcessor.getCurrentFreq()on Apple Silicon can report the frequency the hardware actually ran at, rather than a nominal maximum that never changes. Setoshi.os.mac.cpu.frequency.ioreporttotrue; it is opt-in because it holds a subscription to a private framework for the lifetime of the process - @dbwiddis. - #3680:
oshi-metricsreads a disk or network interface once per memoizer expiration window rather than once per meter, so a scrape makes one query where it previously made five or seven, and the meters of one device report the same reading. A rate computed across two of them, such as errors per packet, is now comparable - @dbwiddis. - #3681:
GpuStats.getGpuUtilization()on Linux reads NVIDIA GPU utilization from NVML. It previously read only the amdgpu/i915/xe sysfs paths, none of which the NVIDIA driver exposes, so an NVIDIA card always returned the -1 sentinel - @Krillsson. - #3686:
GpuStats.getGpuUtilization()on Windows reads NVIDIA utilization from NVML and AMD utilization from ADL, matching the source order of every other metric on the class. It previously ran only LibreHardwareMonitor and a PDH engine-tick delta, which needs two samples, so the first call returned the -1 sentinel - @dbwiddis. - #3687:
GpuStats.getSharedMemoryUsed()on Linux reports the amdgpu GTT memory in use rather than always returning -1, andGraphicsCard.getVRam()on an amdgpu card reports the driver's own figure rather than the memory BAR size parsed fromlspciorlshw. SeveralGpuStatsmetrics on Linux also now return the -1 sentinel when the sysfs file behind them is absent; they previously reported 0, so a card whose hwmon directory omitspower1_averageread as drawing 0.0 W - @dbwiddis. - #3698:
OSProcess.getCurrentWorkingDirectory()on macOS returns the directory rather than an empty string in the FFM implementation, andNetworkParams.getDomainName()on macOS and the BSDs returns the canonical name rather than an empty string in both implementations - @dbwiddis. - #3705: An AIX process or thread that exits between enumeration and the
/procread is now reported as invalid rather than as a live process owned by root - @dbwiddis. - #3705: A failure of
kstat_open()on Solaris throws rather than releasing no lock and passing a null control structure to the kernel. The chain lock is static, so a failed open previously blocked every later kstat query on any thread - @dbwiddis.