Comment puis-je surveiller l'ordinateur du PROCESSEUR, de la mémoire, et l'utilisation du disque en Java?

StackOverflow https://stackoverflow.com/questions/47177

Question

Je tiens à surveiller un système d'information en Java:

  • Utilisation actuelle du PROCESSEUR** (en%)
  • La mémoire disponible* (libre/total)
  • D'espace disque disponible (libre/total)

    *Notez que je veux dire la quantité totale de mémoire disponible pour l'ensemble du système, non seulement la JVM.

Je suis à la recherche d'une solution multi-plateforme (Linux, Mac et Windows) qui ne repose pas sur mon propre code d'appel de programmes externes ou de l'utilisation de JNI.Bien que ces sont des options viables, je préfère ne pas maintenir des OS du code spécifique de moi si quelqu'un a déjà une meilleure solution.

Si il y a un accès gratuit à la bibliothèque qui ne ce dans la plus fiable, la croix-plate-forme de manière, ce serait génial (même si il fait des appels externes ou de l'utilisation de code natif lui-même).

Toutes les suggestions sont appréciés.

Pour clarifier, je voudrais obtenir de l'utilisation actuelle du PROCESSEUR pour l'ensemble du système, pas seulement le processus Java(es).

Le SIGAR API fournit toutes les fonctionnalités que je cherche dans un paquet, de sorte que c'est la meilleure réponse à ma question pour le moment.Toutefois, en raison étant sous licence GPL, je ne peux pas l'utiliser pour mon but, à l'origine (un fermé source, produit commercial).Il est possible que Hyperic peut licence SIGAR pour un usage commercial, mais je n'ai pas regardé en elle.Pour mon GPL projets, je vais certainement considérer SIGAR dans l'avenir.

Pour mes besoins, je me suis penchée vers la suivante:

  • Pour l'utilisation du CPU, OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors() (charge moyenne par uc)
  • Pour mémoire, OperatingSystemMXBean.getTotalPhysicalMemorySize() et OperatingSystemMXBean.getFreePhysicalMemorySize()
  • Pour l'espace disque, File.getTotalSpace() et File.getUsableSpace()

Limitations:

L' getSystemLoadAverage() espace disque et de l'interrogation de méthodes sont disponibles uniquement sur la version 6 de Java.Aussi, certains JMX fonctionnalités peuvent ne pas être disponibles pour toutes les plates-formes (c'est à direil est rapporté que getSystemLoadAverage() retourne -1 sur Windows).

Bien qu'à l'origine sous licence GPL, il a été changé pour Apache 2.0, qui peut généralement être utilisé pour le code source fermé, des produits commerciaux.

Était-ce utile?

La solution

Le long des lignes de ce que j'ai mentionné dans ce post.Je vous recommande d'utiliser le SIGAR API.J'utilise le SIGAR API dans un de mes propres applications, et c'est formidable.Vous verrez qu'il est stable, bien pris en charge, et plein d'exemples utiles.Il est open-source avec un GPL 2 Licence Apache 2.0.Check it out.J'ai le sentiment que ça va répondre à vos besoins.

À l'aide de Java et le Sigar API, vous pouvez obtenir la Mémoire, le PROCESSEUR, le Disque, la Charge Moyenne d'Interface Réseau info et les mesures, la Table de Processus de l'information, de la Voie d'info, etc.

Autres conseils

La suite soi-disant, vous reçoit de CPU et de RAM.Voir ManagementFactory pour plus de détails.

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
}

Dans le JDK 1.7, vous pouvez obtenir de l'UC du système et l'utilisation de la mémoire par com.sun.management.OperatingSystemMXBean.Ceci est différent de celui 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.

Cela fonctionne parfaitement pour moi, sans aucune API externe, juste en Java natif fonctionnalité cachée :)

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());

Jetez un oeil à cette très détaillée de l'article:http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclasstogetJVMCPUtime

Pour obtenir le pourcentage de CPU utilisé, vous n'avez besoin que de quelques opérations mathématiques simples:

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+"%");

Note:Vous devez importer com.sun.management.OperatingSystemMXBean et pas java.lang.management.OperatingSystemMXBean.

Pour l'espace disque, si vous avez la version 6 de Java, vous pouvez utiliser le getTotalSpace et getFreeSpace méthodes sur Fichier.Si vous n'êtes pas sur la version 6 de Java, je crois que vous pouvez utiliser Apache Commons IO pour obtenir une partie de la façon dont il.

Je ne sais pas du tout de la croix-plate-forme de façon à obtenir de l'utilisation de l'UC ou de la Mémoire, j'ai peur.

Beaucoup de ce qui est déjà disponible via JMX.Avec Java 5, JMX est intégré et qu'ils comprennent une console JMX spectateur avec le JDK.

Vous pouvez utiliser JMX pour surveiller manuellement, ou invoquer JMX commandes à partir de Java si vous avez besoin de ces informations dans votre propre moment de l'exécution.

/* 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) { }
        }
    }

Faire un fichier batch "Pc.chauve-souris", comme, typeperf -sc 1 "\mukit\processeur(_Total)\%% Temps Processeur"

Vous pouvez utiliser la classe MProcess,

/*
 *Md. Mukit Hasan
 *CSE-JU,35
 **/
import java.io.*;

public class 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()); } }

}

Puis, après quelques manipulation de chaîne, vous obtenez l'utilisation de l'UC.Vous pouvez utiliser le même processus pour les autres tâches.

--Mukit Hasan

Le code suivant est Linux (Unix peut-être), mais il travaille à un projet réel.

    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(pattern);
            Thread.sleep(delay);
            long cput2 = getCpuT(pattern);
            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(Pattern pattern) throws FileNotFoundException, IOException {
    BufferedReader reader = new BufferedReader(new FileReader("/proc/stat"));
    String line = reader.readLine();
    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;
}

La accepté de répondre en 2008 recommandé SIGAR.Cependant, comme un commentaire à partir de 2014 (@Alvaro) dit:

Être prudent lors de l'utilisation de Sigar, il y a des problèmes sur les machines x64... Sigar 1.6.4 plante:EXCEPTION_ACCESS_VIOLATION et il semble que la bibliothèque n'est pas mis à jour depuis 2010

Ma recommandation est d'utiliser https://github.com/oshi/oshi

Ou l' réponse mentionné ci-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top