2016-06-29 9 views
2

例えばlinux htop:http://scr.hu/1det/r1ghlで、私のアプリケーションCPU使用量をpid:27914でチェックインすると51%が印刷されます。これを行う方法?アプリケーションに独自のPIDを取得するにはどうすればよいですか。どのように外部ライブラリなしでJavaでアプリケーションによってCPU使用量を取得するには?

public static int calcCPU(long cpuStartTime, long elapsedStartTime, int cpuCount) { 
    long end = System.nanoTime(); 
    long totalAvailCPUTime = cpuCount * (end - elapsedStartTime); 
    long totalUsedCPUTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime() - cpuStartTime; 
    //log("Total CPU Time:" + totalUsedCPUTime + " ns."); 
    //log("Total Avail CPU Time:" + totalAvailCPUTime + " ns."); 
    float per = ((float) totalUsedCPUTime * 100)/(float) totalAvailCPUTime; 
    log(per); 
    return (int) per; 
} 

static boolean isPrime(int n) { 
    // 2 is the smallest prime 
    if (n <= 2) { 
     return n == 2; 
    } 
    // even numbers other than 2 are not prime 
    if (n % 2 == 0) { 
     return false; 
    } 
    // check odd divisors from 3 
    // to the square root of n 
    for (int i = 3, end = (int) Math.sqrt(n); i <= end; i += 2) { 
     if (n % i == 0) { 
      return false; 
     } 
    } 
    return true; 
} 

public static void main(String[] args) throws ParseException, NoSuchAlgorithmException { 
    int mb = 1024 * 1024; 

    int gb = 1024 * 1024 * 1024; 
    /* PHYSICAL MEMORY USAGE */ 
    System.out.println("\n**** Sizes in Mega Bytes ****\n"); 
    com.sun.management.OperatingSystemMXBean operatingSystemMXBean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 
    //RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); 
    //operatingSystemMXBean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 
    com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 
    for (int i = 0; i < 30; i++) { 
     long start = System.nanoTime(); 
     // log(start); 
     //number of available processors; 
     int cpuCount = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors(); 
     Random random = new Random(start); 
     int seed = Math.abs(random.nextInt()); 
     log("\n \n CPU USAGE DETAILS \n\n"); 
     log("Starting Test with " + cpuCount + " CPUs and random number:" + seed); 
     int primes = 10000; 
     // 
     long startCPUTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime(); 
     start = System.nanoTime(); 
     while (primes != 0) { 
      if (isPrime(seed)) { 
       primes--; 
      } 
      seed++; 

     } 
     float cpuPercent = calcCPU(startCPUTime, start, cpuCount); 
     log("CPU USAGE : " + cpuPercent + " % "); 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     } 
    } 

    try { 
     Thread.sleep(500); 
    } catch (Exception ignored) { 
    } 
} 

私はこれを試してみましたが、私は私は1つのアプリケーション

答えて

2

することにより、この方法の使用のCPUに確認することができないと思う私はあなたがネイティブメソッドを呼び出すことなく、Javaのツールボックスのうち、現時点でこれを行うことができないと思いますおよび/または第三者のライブラリおよび/またはプラットフォーム固有のコマンドラインコマンドを呼び出すことができる。

Java Processオブジェクトは現在のところ非常に制限されています。オペレーティング・システム プロセスを制御し、管理するためのAPIを改善

概要

良いニュースは、新しいProcess facility is coming in Java 9ということです。

動機は

現在のAPIの制限は、多くの場合、 ネイティブコードに頼る開発者を強制します。

説明

のJava SEは、ネイティブオペレーティングシステム プロセスのための限定的なサポートを提供します。これは、環境を設定し、 プロセスを開始するための基本的なAPIを提供します。プロセスストリームは、Java SE 7以降、ファイル、パイプ、または にリダイレクトされるか、継承されます。いったん開始されると、APIは を使用してプロセスを破棄したり、プロセスが終了するのを待ったりできます。

多くのエンタープライズアプリケーションとコンテナは、Java 複数の仮想マシンとプロセスを伴い、 には、長年のニーズがあります。現在のJava仮想 マシンとのPID(または同等)を取得する

能力を既存のAPIで作成されたプロセスのPID。

システム上のプロセスを列挙する機能。各 プロセスの情報には、そのpid、名前、状態、およびおそらくリソースの使用状況が含まれます。

プロセスツリーを処理する能力、特にいくつかの手段は、プロセスツリーを破棄する方法です。

サブプロセスごとに スレッドを作成しないように、おそらく 出力ストリームまたはエラーストリームを多重化する何百ものサブプロセスを処理する能力。


編集:ユーザー、サードパーティのライブラリにしたい場合に使用するための提案。

あなたはSigarを見てみたいことがあります

概要SigarのAPIのような のシステム情報を収集するためのポータブルインタフェースを提供します:

システムメモリ、スワップ、CPU、負荷平均、稼働時間、ログインプロセスごと メモリ、CPU、資格情報、状態、引数、環境、オープン ファイルシステム検出とメトリックネットワークインターフェイス検出、 構成情報とメトリックTCPとUDP接続テーブルネットワーク ルートテーブルこの情報はほとんどのオペレーティングシステムで利用可能ですが、 ですが、各OSには独自の方法があります。 SIGARは の開発者に対して、基本プラットフォームの に関係なく、この情報にアクセスするためのAPIを1つ提供しています。コアAPIは、Java、Perl、Ruby、Python、Erlang、 PHPおよびC#用に現在実装されている バインディングで純粋なC言語で実装されています。

+0

これを確認できるライブラリをお届けしますか? – Larry

+0

@Larry私は私のコメントを編集します、上記を参照してください。 –

関連する問題