使用OSHI lib

时间:2019-04-29 17:23:27

标签: java memory cpu-usage

在我的应用程序中,我从另一个应用程序获取了该进程占用的估计内存。但我希望获得处理器运行所需的确切内存。

当我在线搜索如何获取进程所需的正确内存时,我发现oshi lib可以做到这一点。但是我没有找到实现解决方案的方法。谁能帮我吗?

OSHI库:https://github.com/oshi/oshi

仅供参考:我们使用OSHI lib来获取systemInfo,硬件,操作系统,centralProcessor和全局内存。下面是代码片段。

    oshi.SystemInfo systemInfo = new oshi.SystemInfo();
    this.hal = systemInfo.getHardware();
    this.os = systemInfo.getOperatingSystem();
    this.centralProcessor = this.hal.getProcessor();
    this.globalMemory = this.hal.getMemory();

2 个答案:

答案 0 :(得分:1)

也许从OSProcess类中检索内存使用情况:

OSProcess process =  new SystemInfo().getHardware().getOperatingSystem().getProcess(myPid);
process.getVirtualSize();
process.getResidentSetSize();

答案 1 :(得分:1)

public static void memoryUtilizationPerProcess(int pid) {
        /**
         * Resident Size : how much memory is allocated to that process and is in RAM
         */
        OSProcess process;
        SystemInfo si = new SystemInfo();
        OperatingSystem os = si.getOperatingSystem();
        process = os.getProcess(pid);
        oshi.hardware.GlobalMemory globalMemory = si.getHardware().getMemory();
        long usedRamProcess = process.getResidentSetSize();
        long totalRam = globalMemory.getTotal();
        double res1 = (double) ((usedRamProcess*100)/totalRam);
        System.out.println("\nMemory Usage :");
        System.out.println("Memory(Ram Used/Total Mem)="+res1+"%");
        System.out.println("Resident Size: "+humanReadableByteCountBin(usedRamProcess));
        System.out.println("Total Size: "+humanReadableByteCountBin(totalRam));

    }

 public static String humanReadableByteCountBin(long bytes) {
        long absB = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes);
        if (absB < 1024) {
            return bytes + " B";
        }
        long value = absB;
        CharacterIterator ci = new StringCharacterIterator("KMGTPE");
        for (int i = 40; i >= 0 && absB > 0xfffccccccccccccL >> i; i -= 10) {
            value >>= 10;
            ci.next();
        }
        value *= Long.signum(bytes);
        return String.format("%.1f %ciB", value / 1024.0, ci.current());
    }