2017-06-10 21 views
1

を取得し、私は特定のプロセスのために、以下のデータを達成するための最善のアプローチを調査してきた:のJava(Windowsの場合) - プロセスID、メモリ使用率、ディスク使用量、ネットワーク使用率

  1. CPU使用率
  2. 私はOSHI(オペレーティングシステム&ハードウェアインフォアで行くことにしたメモリ使用量
  3. ディスク使用量
  4. ネットワークの使用状況

API)。 私にとっては不幸なことですが、このAPIは必要な情報を私に提供していません。プロセスあたりのCPU使用量などの計算方法に関する基本的な知識が必要です。

私の質問は、どのようにメモリ、ディスク、ネットワークの使用状況をプロセスIDで取得できますか?

claculator.exe実行中のプロセスの実際のCPU使用率を取得する:例えばprcoess

ごとのCPU使用データの次の例を用いて

import oshi.SystemInfo; 
import oshi.hardware.CentralProcessor; 
import oshi.software.os.OSProcess; 
import oshi.software.os.OperatingSystem; 

public class processCPUusage { 
    public static void main(String[] args) throws InterruptedException { 
     OSProcess process; 
     long currentTime,previousTime = 0,timeDifference; 
     double cpu; 
     int pid = 7132; 
     SystemInfo si = new SystemInfo(); 
     OperatingSystem os = si.getOperatingSystem(); 
     CentralProcessor processor = si.getHardware().getProcessor(); 
     int cpuNumber = processor.getLogicalProcessorCount(); 
     boolean processExists = true; 
     while (processExists) { 
      process = os.getProcess(pid); // calculator.exe process id 
      if (process != null) { 
       // CPU 
       currentTime = process.getKernelTime() + process.getUserTime(); 

       if (previousTime != -1) { 
        // If we have both a previous and a current time 
        // we can calculate the CPU usage 
        timeDifference = currentTime - previousTime; 
        cpu = (100d * (timeDifference/((double) 1000)))/cpuNumber; 
        System.out.println(cpu); 
       }  

       previousTime = currentTime; 

       Thread.sleep(1000); 
      } else { 
       processExists = false; 
      } 
     } 
    } 
} 

フレームワークを私は https://github.com/oshi/oshi/tree/master/src/site/markdown を使用すると、目的の機能が示されますが、適切な例はありません。

  • 言語:Javaの8
  • ビルド・ツール:Mavenの2
  • OS:Windowsの10 *

OSHIライブラリ+ SLF4J

<dependency> 
     <groupId>com.github.dblock</groupId> 
     <artifactId>oshi-core</artifactId> 
     <version>3.4.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.5</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.7.5</version> 
    </dependency> 

答えて

1

私はOSProcessクラスを実装する一人ですあなたが参照しているOSHIで、そのプロジェクトの問題であなたと連絡しています。

OSHIは現在、OSProcessインターフェイスのすべての機能を提供していませんが、求めるすべての情報を提供するWMIクラスへのアクセス方法を提供しています。あなたが使用しているgetProcess()メソッドを実装しているWindowsOperatingSystemクラスを見ているなら、WMIUtilを使ってコードをコピー/修正すれば、必要な情報を直接取得できます。

OSHIは現在Win32_Process WMIクラスからフェッチが、私は問題に言及してきたように、Win32_PerfRawData_PerfProc_Process(あなたが直接計算に使用することができ、生データを提供する)またはWin32_PerfFormattedData_PerfProc_Processからではなく情報を取得するには良いかもしれません。これらのクラスでは、見つけることができます:

CPU使用率

  • 経過時間
  • PercentPrivilegedTime
  • PercentProcessorTime
  • PercentUserTime

(注名は "パーセント" と言いながら、生データには実際には「ティック」がインクリメントされます)

メモリ使用量

  • VirtualBytes
  • のworkingSet

ディスク使用量、ネットワークの使用状況

  • IOReadBytesPerSec。
  • IOWriteBytesPerSec;

これらのクラスでは、ディスクとネットワークの両方が合計で合計されます。 (ここでも、「生データ」は「毎秒」の部分を無視するため、データの総量が増加します)。

WindowsはディスクベースとネットワークIOの違いをプロセスごとに把握していないと思います。あなたが取るべき

ステップ:

  1. はあなたが

  2. が 同じ順序で、フィールド名に一致するタイプでValueType配列を定義したいWMIフィールド名でカンマ区切りの文字列を定義します。

  3. 実行Map<String, List<Object>> procs = WmiUtil.selectObjectsFrom(null, "Win32_PerfRawData_PerfProc_Process", processProperties, String.format("WHERE IdProcess=%d", pid), processPropertyTypes);

  4. 使用する各値を取得するprocs.get("FieldNameHere").get(0)

関連する問題