243 votes

obtenez de l'OS au niveau du système d'information

Je suis actuellement à la construction d'une application Java qui pourrait être fonctionner sur plusieurs plates-formes, mais principalement des variantes de Solaris, Linux et Windows.

Quelqu'un a réussi à extraire des informations telles que l'espace disque utilisé, utilisation CPU et de la mémoire utilisée dans l'OS sous-jacent? Ce sujet vient de ce que le Java application elle-même est trop long?

De préférence j'aimerais obtenir cette information sans utiliser JNI.

209voto

William Brendel Points 15453

Vous pouvez obtenir un peu de la mémoire limitée de l'information à partir de la classe Runtime. Ce n'est pas vraiment exactement ce que vous cherchez, mais j'ai pensé que je pourrais fournir par souci d'exhaustivité. Voici un petit exemple. Edit: Vous pouvez également obtenir de l'utilisation du disque de l'information à partir de la java.io.Fichier de classe. L'utilisation de l'espace disque trucs nécessite Java 1.6 ou supérieur.

public class Main {
  public static void main(String[] args) {
    /* Total number of processors or cores available to the JVM */
    System.out.println("Available processors (cores): " + 
        Runtime.getRuntime().availableProcessors());

    /* Total amount of free memory available to the JVM */
    System.out.println("Free memory (bytes): " + 
        Runtime.getRuntime().freeMemory());

    /* This will return Long.MAX_VALUE if there is no preset limit */
    long maxMemory = Runtime.getRuntime().maxMemory();
    /* Maximum amount of memory the JVM will attempt to use */
    System.out.println("Maximum memory (bytes): " + 
        (maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));

    /* Total memory currently available to the JVM */
    System.out.println("Total memory available to JVM (bytes): " + 
        Runtime.getRuntime().totalMemory());

    /* Get a list of all filesystem roots on this system */
    File[] roots = File.listRoots();

    /* For each filesystem root, print some info */
    for (File root : roots) {
      System.out.println("File system root: " + root.getAbsolutePath());
      System.out.println("Total space (bytes): " + root.getTotalSpace());
      System.out.println("Free space (bytes): " + root.getFreeSpace());
      System.out.println("Usable space (bytes): " + root.getUsableSpace());
    }
  }
}

98voto

Patrick Wilkes Points 1421

Le java.lang.gestion de package ne vous donner beaucoup plus d'informations que l'Exécution, par exemple, il vous donnera la mémoire du tas (ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()) distincte de la non-mémoire du tas (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()).

Vous pouvez également obtenir des processus d'utilisation de l'UC (sans écrire votre propre JNI code), mais vous avez besoin de jeter l' java.lang.management.OperatingSystemMXBean d'un com.sun.management.OperatingSystemMXBean. Cela fonctionne sur Windows et Linux, je n'ai pas testé ailleurs.

Par exemple, le obtenir getCpuUsage() la méthode la plus fréquemment pour obtenir des lectures plus précises.

public class PerformanceMonitor { 
    private int  availableProcessors = getOperatingSystemMXBean().getAvailableProcessors();
    private long lastSystemTime      = 0;
    private long lastProcessCpuTime  = 0;

    public synchronized double getCpuUsage()
    {
        if ( lastSystemTime == 0 )
        {
            baselineCounters();
            return;
        }

        long systemTime     = System.nanoTime();
        long processCpuTime = 0;

        if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
        {
            processCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
        }

        double cpuUsage = (double) ( processCpuTime - lastProcessCpuTime ) / ( systemTime - lastSystemTime );

        lastSystemTime     = systemTime;
        lastProcessCpuTime = processCpuTime;

        return cpuUsage / availableProcessors;
    }

    private void baselineCounters()
    {
        lastSystemTime = System.nanoTime();

        if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
        {
            lastProcessCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
        }
    }
}

43voto

Matt Cummings Points 1288

Je pense que la meilleure méthode est de mettre en œuvre le SIGAR API par Hyperic. Il fonctionne pour la plupart des principaux systèmes d'exploitation ( sacrément près rien de moderne ) et il est très facile de travailler avec. Le développeur(s) sont très sensibles sur leur forum et les listes de diffusion. J'aime aussi qu'il est GPL2 sous licence Apache. Ils fournissent une tonne d'exemples en Java aussi!

SIGAR == Système d'Information, la Collecte Et l'outil de Reporting.

29voto

dB. Points 2350

Il y a un natif de projet Java qui utilise la JNA (donc pas de bibliothèques natives). Il est très jeune et les besoins des contributions.

11voto

Alexandr Points 174

Vous pouvez obtenir des informations au niveau du système en utilisant System.getenv(), en passant de l'environnement nom de la variable comme paramètre. Par exemple, sur Windows:

System.getenv("PROCESSOR_IDENTIFIER")
System.getenv("PROCESSOR_ARCHITECTURE")
System.getenv("PROCESSOR_ARCHITEW6432")
System.getenv("NUMBER_OF_PROCESSORS")

Pour les autres systèmes d'exploitation, la présence/absence et les noms des variables d'environnement appropriées seront différents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X