201

Javaで次のシステム情報を監視したいと思います。

  • 現在のCPU使用率**(パーセント)
  • 使用可能なメモリ*(空き/合計)
  • 使用可能なディスク容量(空き/合計)

    *つまり、JVMだけでなく、システム全体で使用可能なメモリ全体を意味することに注意してください。

外部プログラムを呼び出したり、JNIを使​​用したりする自分のコードに依存しないクロスプラットフォームソリューション(Linux、Mac、およびWindows)を探しています。これらは実行可能なオプションですが、誰かがすでにより良い解決策を持っている場合は、OS固有のコードを自分で維持したくないと思います。

信頼性の高いクロスプラットフォームの方法でこれを行う無料のライブラリがあれば、それは素晴らしいことです(外部呼び出しを行ったり、ネイティブコード自体を使用したりする場合でも)。

どんな提案でも大歓迎です。

明確にするために、Javaプロセスだけでなく、システム全体の現在のCPU使用率を取得したいと思います。

SIGAR APIは、私が探しているすべての機能を1つのパッケージで提供するため、これまでの私の質問に対する最良の答えです。ただし、GPLの下でライセンスされているため、本来の目的(クローズドソース、商用製品)には使用できません。HypericがSIGARの商用利用を許可している可能性はありますが、私はそれを調べていません。私のGPLプロジェクトでは、将来的に確実にSIGARを検討します。

私の現在のニーズのために、私は次のことに傾いています:

  • CPU使用率については、OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors()(CPUあたりの平均負荷)
  • 記憶のために、OperatingSystemMXBean.getTotalPhysicalMemorySize()そしてOperatingSystemMXBean.getFreePhysicalMemorySize()
  • ディスク容量の場合、File.getTotalSpace()およびFile.getUsableSpace()

制限:

およびディスク容量のgetSystemLoadAverage()クエリメソッドは、Java 6でのみ使用できます。また、一部のJMX機能は、すべてのプラットフォームで使用できるとは限りません(つまりgetSystemLoadAverage()、Windowsで-1を返すことが報告されています)。

元々はGPLの下でライセンスされていましたが、 Apache 2.0に変更されました。これは通常、クローズドソースの商用製品に使用できます。

4

12 に答える 12

68

この投稿で述べたことに沿って。SIGAR APIを使用することをお勧めします。私は自分のアプリケーションの 1 つで SIGAR API を使用していますが、これは素晴らしいものです。安定しており、十分にサポートされており、便利な例がたくさんあります。GPL 2 Apache 2.0 ライセンスによるオープンソースです。見てみな。あなたのニーズに応えてくれる気がします。

Java と Sigar API を使用すると、メモリ、CPU、ディスク、負荷平均、ネットワーク インターフェイス情報とメトリック、プロセス テーブル情報、ルート情報などを取得できます。

于 2008-09-06T06:31:29.400 に答える
58

以下はおそらくあなたにCPUとRAMを取得します。詳細については、 ManagementFactoryを参照してください。

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

private static void printUsage() {
  OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
  for (Method method : operatingSystemMXBean.getClass().getDeclaredMethods()) {
    method.setAccessible(true);
    if (method.getName().startsWith("get")
        && Modifier.isPublic(method.getModifiers())) {
            Object value;
        try {
            value = method.invoke(operatingSystemMXBean);
        } catch (Exception e) {
            value = e;
        } // try
        System.out.println(method.getName() + " = " + value);
    } // if
  } // for
}
于 2008-09-06T02:23:07.093 に答える
46

JDK 1.7 では、システムの CPU とメモリの使用量を 経由で取得できますcom.sun.management.OperatingSystemMXBean。これは とは異なりjava.lang.management.OperatingSystemMXBeanます。

long getCommittedVirtualMemorySize()
// Returns the amount of virtual memory that is guaranteed to be available to the running process in bytes, or -1 if this operation is not supported.

long getFreePhysicalMemorySize()
// Returns the amount of free physical memory in bytes.

long getFreeSwapSpaceSize()
// Returns the amount of free swap space in bytes.

double getProcessCpuLoad()
// Returns the "recent cpu usage" for the Java Virtual Machine process.

long getProcessCpuTime()
// Returns the CPU time used by the process on which the Java virtual machine is running in nanoseconds.

double getSystemCpuLoad()
// Returns the "recent cpu usage" for the whole system.

long getTotalPhysicalMemorySize()
// Returns the total amount of physical memory in bytes.

long getTotalSwapSpaceSize()
// Returns the total amount of swap space in bytes.
于 2012-10-23T15:36:10.900 に答える
33

これは、外部APIなしで完全に機能し、ネイティブのJava隠し機能だけです:)

import com.sun.management.OperatingSystemMXBean;
...
OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(
                OperatingSystemMXBean.class);
// What % CPU load this current JVM is taking, from 0.0-1.0
System.out.println(osBean.getProcessCpuLoad());

// What % load the overall system is at, from 0.0-1.0
System.out.println(osBean.getSystemCpuLoad());
于 2014-12-03T21:30:59.177 に答える
17

この非常に詳細な記事をご覧ください: http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclasstogetJVMCPUtime

CPU の使用率を取得するために必要なのは、いくつかの簡単な計算だけです。

MBeanServerConnection mbsc = ManagementFactory.getPlatformMBeanServer();

OperatingSystemMXBean osMBean = ManagementFactory.newPlatformMXBeanProxy(
mbsc, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);

long nanoBefore = System.nanoTime();
long cpuBefore = osMBean.getProcessCpuTime();

// Call an expensive task, or sleep if you are monitoring a remote process

long cpuAfter = osMBean.getProcessCpuTime();
long nanoAfter = System.nanoTime();

long percent;
if (nanoAfter > nanoBefore)
 percent = ((cpuAfter-cpuBefore)*100L)/
   (nanoAfter-nanoBefore);
else percent = 0;

System.out.println("Cpu usage: "+percent+"%");

com.sun.management.OperatingSystemMXBean注:ではなく、インポートする必要がありjava.lang.management.OperatingSystemMXBeanます。

于 2010-06-22T18:04:17.910 に答える
8

ディスクスペースについては、Java 6を使用している場合、 FileでgetTotalSpaceメソッドとgetFreeSpaceメソッドを使用できます。Java 6を使用していない場合は、ApacheCommonsIOを使用してそこに到達できると思います。

恐れているCPU使用率やメモリ使用率を取得するためのクロスプラットフォームの方法を知りません。

于 2008-09-06T02:10:08.077 に答える
6

これの多くは、JMXを介してすでに利用可能です。Java 5には、JMXが組み込まれており、JDKを備えたJMXコンソールビューアが含まれています。

JMXを使用して手動で監視するか、独自の実行時にこの情報が必要な場合はJavaからJMXコマンドを呼び出すことができます。

于 2008-09-07T03:51:04.020 に答える
5
/* YOU CAN TRY THIS TOO */

import java.io.File;
 import java.lang.management.ManagementFactory;
// import java.lang.management.OperatingSystemMXBean;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.management.RuntimeMXBean;
 import java.io.*;
 import java.net.*;
 import java.util.*;
 import java.io.LineNumberReader;
 import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;
import java.lang.management.ManagementFactory;
import java.util.Random;



 public class Pragati
 {

     public static void printUsage(Runtime runtime)
     {
     long total, free, used;
     int mb = 1024*1024;

     total = runtime.totalMemory();
     free = runtime.freeMemory();
     used = total - free;
     System.out.println("\nTotal Memory: " + total / mb + "MB");
     System.out.println(" Memory Used: " + used / mb + "MB");
     System.out.println(" Memory Free: " + free / mb + "MB");
     System.out.println("Percent Used: " + ((double)used/(double)total)*100 + "%");
     System.out.println("Percent Free: " + ((double)free/(double)total)*100 + "%");
    }
    public static void log(Object message)
         {
            System.out.println(message);
         }

        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)
    {
            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();
            long physicalMemorySize = os.getTotalPhysicalMemorySize();
            System.out.println("PHYSICAL MEMORY DETAILS \n");
            System.out.println("total physical memory : " + physicalMemorySize / mb + "MB ");
            long physicalfreeMemorySize = os.getFreePhysicalMemorySize();
            System.out.println("total free physical memory : " + physicalfreeMemorySize / mb + "MB");
            /* DISC SPACE DETAILS */
            File diskPartition = new File("C:");
            File diskPartition1 = new File("D:");
            File diskPartition2 = new File("E:");
            long totalCapacity = diskPartition.getTotalSpace() / gb;
            long totalCapacity1 = diskPartition1.getTotalSpace() / gb;
            double freePartitionSpace = diskPartition.getFreeSpace() / gb;
            double freePartitionSpace1 = diskPartition1.getFreeSpace() / gb;
            double freePartitionSpace2 = diskPartition2.getFreeSpace() / gb;
            double usablePatitionSpace = diskPartition.getUsableSpace() / gb;
            System.out.println("\n**** Sizes in Giga Bytes ****\n");
            System.out.println("DISC SPACE DETAILS \n");
            //System.out.println("Total C partition size : " + totalCapacity + "GB");
            //System.out.println("Usable Space : " + usablePatitionSpace + "GB");
            System.out.println("Free Space in drive C: : " + freePartitionSpace + "GB");
            System.out.println("Free Space in drive D:  : " + freePartitionSpace1 + "GB");
            System.out.println("Free Space in drive E: " + freePartitionSpace2 + "GB");
            if(freePartitionSpace <= totalCapacity%10 || freePartitionSpace1 <= totalCapacity1%10)
            {
                System.out.println(" !!!alert!!!!");
            }
            else
                System.out.println("no alert");

            Runtime runtime;
            byte[] bytes;
            System.out.println("\n \n**MEMORY DETAILS  ** \n");
            // Print initial memory usage.
            runtime = Runtime.getRuntime();
            printUsage(runtime);

            // Allocate a 1 Megabyte and print memory usage
            bytes = new byte[1024*1024];
            printUsage(runtime);

            bytes = null;
            // Invoke garbage collector to reclaim the allocated memory.
            runtime.gc();

            // Wait 5 seconds to give garbage collector a chance to run
            try {
            Thread.sleep(5000);
            } catch(InterruptedException e) {
            e.printStackTrace();
            return;
            }

            // Total memory will probably be the same as the second printUsage call,
            // but the free memory should be about 1 Megabyte larger if garbage
            // collection kicked in.
            printUsage(runtime);
            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);
            }`enter code here`
            catch (Exception ignored) { }
        }
    }
于 2014-02-14T06:48:57.967 に答える
4

次のコードは Linux (おそらく Unix) のみですが、実際のプロジェクトでは機能します。

    private double getAverageValueByLinux() throws InterruptedException {
    try {

        long delay = 50;
        List<Double> listValues = new ArrayList<Double>();
        for (int i = 0; i < 100; i++) {
            long cput1 = getCpuT();
            Thread.sleep(delay);
            long cput2 = getCpuT();
            double cpuproc = (1000d * (cput2 - cput1)) / (double) delay;
            listValues.add(cpuproc);
        }
        listValues.remove(0);
        listValues.remove(listValues.size() - 1);
        double sum = 0.0;
        for (Double double1 : listValues) {
            sum += double1;
        }
        return sum / listValues.size();
    } catch (Exception e) {
        e.printStackTrace();
        return 0;
    }

}

private long getCpuT throws FileNotFoundException, IOException {
    BufferedReader reader = new BufferedReader(new FileReader("/proc/stat"));
    String line = reader.readLine();
    Pattern pattern = Pattern.compile("\\D+(\\d+)\\D+(\\d+)\\D+(\\d+)\\D+(\\d+)")
    Matcher m = pattern.matcher(line);

    long cpuUser = 0;
    long cpuSystem = 0;
    if (m.find()) {
        cpuUser = Long.parseLong(m.group(1));
        cpuSystem = Long.parseLong(m.group(3));
    }
    return cpuUser + cpuSystem;
}
于 2009-05-07T15:04:44.850 に答える
3

typeperf -sc 1 "\mukit\processor(_Total)\%% Processor Time" として、バッチ ファイル "Pc.bat" を作成します。

クラス MProcess を使用できます。

/*
 *Md. ムキット・ハサン
 *CSE-JU,35
 **/
java.io.* をインポートします。

パブリック クラス MProcessor {

public MProcessor() { String s; try { Process ps = Runtime.getRuntime().exec("Pc.bat"); BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream())); while((s = br.readLine()) != null) { System.out.println(s); } } catch( Exception ex ) { System.out.println(ex.toString()); } }

}

次に、いくつかの文字列操作の後、CPU 使用率を取得します。他のタスクにも同じプロセスを使用できます。

――ムキット・ハサン

于 2010-05-15T17:32:33.333 に答える