Je souhaite surveiller les informations système suivantes en Java:
- Utilisation actuelle du processeur ** (pourcentage)
- Mémoire disponible * (libre / totale)
Espace disque disponible (libre / total)
* Notez que je veux dire la mémoire globale disponible pour l'ensemble du système, pas seulement la JVM.
Je recherche une solution multiplateforme (Linux, Mac et Windows) qui ne repose pas sur mon propre code appelant des programmes externes ou utilisant JNI. Bien que ce soient des options viables, je préférerais ne pas gérer moi-même le code spécifique au système d'exploitation si quelqu'un a déjà une meilleure solution.
S'il existe une bibliothèque gratuite qui le fait de manière fiable et multiplateforme, ce serait génial (même si elle effectue des appels externes ou utilise du code natif lui-même).
Les suggestions sont très appréciées.
Pour clarifier, je voudrais obtenir l'utilisation actuelle du processeur pour l'ensemble du système, pas seulement le ou les processus Java.
L'API SIGAR fournit toutes les fonctionnalités que je recherche dans un seul package, c'est donc la meilleure réponse à ma question à ce jour. Cependant, en raison de sa licence sous GPL, je ne peux pas l'utiliser pour mon objectif initial (une source fermée, un produit commercial). Il est possible qu'Hyperic accorde une licence à SIGAR à des fins commerciales, mais je ne l'ai pas examiné. Pour mes projets GPL, je considérerai certainement SIGAR à l'avenir.
Pour mes besoins actuels, je penche vers ce qui suit:
- Pour l'utilisation du processeur,
OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors()
(charge moyenne par processeur) - Pour mémoire,
OperatingSystemMXBean.getTotalPhysicalMemorySize()
etOperatingSystemMXBean.getFreePhysicalMemorySize()
- Pour l'espace disque,
File.getTotalSpace()
etFile.getUsableSpace()
Limites:
Les getSystemLoadAverage()
méthodes d'interrogation de l'espace disque et ne sont disponibles que sous Java 6. De plus, certaines fonctionnalités de JMX peuvent ne pas être disponibles sur toutes les plates-formes (c'est-à-dire qu'il a été signalé qu'elle getSystemLoadAverage()
renvoie -1 sous Windows).
Bien que sous licence GPL à l'origine, il a été remplacé par Apache 2.0 , qui peut généralement être utilisé pour des produits commerciaux à source fermée.
Réponses:
Dans le sens de ce que j'ai mentionné dans cet article . Je vous recommande d'utiliser l' API SIGAR . J'utilise l'API SIGAR dans l'une de mes propres applications et c'est génial. Vous trouverez qu'il est stable, bien pris en charge et plein d'exemples utiles. Il est open-source avec une
licence GPL 2Apache 2.0. Vérifiez-le. J'ai le sentiment qu'il répondra à vos besoins.En utilisant Java et l'API Sigar, vous pouvez obtenir la mémoire, le processeur, le disque, la charge moyenne, les informations et les métriques d'interface réseau, les informations de table de processus, les informations d'itinéraire, etc.
la source
Ce qui suit est censé vous procurer du processeur et de la RAM. Voir ManagementFactory pour plus de détails.
la source
Dans JDK 1.7, vous pouvez obtenir l'utilisation du processeur et de la mémoire du système via
com.sun.management.OperatingSystemMXBean
. C'est différent dejava.lang.management.OperatingSystemMXBean
.la source
Cela fonctionne parfaitement pour moi sans aucune API externe, juste une fonctionnalité cachée Java native :)
la source
Jetez un œil à cet article très détaillé: http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclasstogetJVMCPUtime
Pour obtenir le pourcentage de CPU utilisé, il vous suffit de quelques calculs simples:
Remarque: vous devez importer
com.sun.management.OperatingSystemMXBean
et nonjava.lang.management.OperatingSystemMXBean
.la source
Pour l'espace disque, si vous disposez de Java 6, vous pouvez utiliser les méthodes getTotalSpace et getFreeSpace sur File. Si vous n'êtes pas sur Java 6, je pense que vous pouvez utiliser Apache Commons IO pour vous y retrouver.
Je ne connais aucun moyen multiplateforme pour obtenir l'utilisation du processeur ou de la mémoire, j'ai peur.
la source
Une grande partie de cela est déjà disponible via JMX. Avec Java 5, JMX est intégré et ils incluent un visualiseur de console JMX avec le JDK.
Vous pouvez utiliser JMX pour surveiller manuellement ou appeler des commandes JMX à partir de Java si vous avez besoin de ces informations dans votre propre environnement d'exécution.
la source
La réponse acceptée en 2008 recommandait SIGAR. Cependant, comme un commentaire de 2014 (@Alvaro) dit:
Ma recommandation est d'utiliser https://github.com/oshi/oshi
Ou la réponse mentionnée ci-dessus .
la source
la source
Le code suivant est uniquement Linux (peut-être Unix), mais il fonctionne dans un vrai projet.
la source
Créez un fichier de commandes "Pc.bat" sous la forme, typeperf -sc 1 "\ mukit \ processor (_Total) \ %% Processor Time"
Vous pouvez utiliser la classe MProcess,
}
Ensuite, après quelques manipulations de chaînes, vous obtenez l'utilisation du processeur. Vous pouvez utiliser le même processus pour d'autres tâches.
--Mukit Hasan
la source
typeperf "\processor(_total)\% processor time"
Si vous le mettez dans un fichier batch, utilisez %% au lieu de%. J'ai utilisé technet.microsoft.com/en-us/library/bb490960.aspx .