Je construis actuellement une application Java qui pourrait finir par être exécutée sur de nombreuses plates-formes différentes, mais principalement des variantes de Solaris, Linux et Windows.
Quelqu'un a-t-il réussi à extraire des informations telles que l'espace disque actuellement utilisé, l'utilisation du processeur et la mémoire utilisée dans le système d'exploitation sous-jacent? Qu'en est-il de ce que l'application Java elle-même consomme?
De préférence, j'aimerais obtenir ces informations sans utiliser JNI.
Runtime.getRuntime().freeMemory()
comme suggéré dans la réponse acceptée NE VOUS donne PAS la quantité de mémoire disponible.Réponses:
Vous pouvez obtenir des informations sur la mémoire limitée de la classe Runtime. Ce n'est vraiment pas exactement ce que vous recherchez, mais j'ai pensé que je le fournirais par souci d'exhaustivité. Voici un petit exemple. Modifier: vous pouvez également obtenir des informations sur l'utilisation du disque à partir de la classe java.io.File. L'utilisation de l'espace disque nécessite Java 1.6 ou supérieur.
la source
Le package java.lang.management vous donne beaucoup plus d'informations que Runtime - par exemple, il vous donnera une mémoire de tas (
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
) distincte de la mémoire non de tas (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
).Vous pouvez également obtenir l'utilisation du processeur du processus (sans écrire votre propre code JNI), mais vous devez convertir le
java.lang.management.OperatingSystemMXBean
en acom.sun.management.OperatingSystemMXBean
. Cela fonctionne sur Windows et Linux, je ne l'ai pas testé ailleurs.Par exemple ... appelez la méthode get getCpuUsage () plus fréquemment pour obtenir des lectures plus précises.
la source
OperatingSystemMXBean
encom.sun.management.OperatingSystemMXBean
et faites précéder toutes les instances degetOperatingSystemMXBean()
avecManagementFactory.
. Vous devez importer toutes les classes de manière appropriée.getCpuUsage
moyenne que le système utilise toutes ses availableProcessors à 100%?((double)( processCpuTime - lastProcessCpuTime )) / ((double)( systemTime - lastSystemTime ))
Je pense que la meilleure méthode est d'implémenter l' API SIGAR par Hyperic . Il fonctionne pour la plupart des principaux systèmes d'exploitation (sacrément proche de tout ce qui est moderne) et est très facile à utiliser. Les développeurs sont très réactifs sur leur forum et leurs listes de diffusion. J'aime aussi le fait qu'il soit sous licence
GPL2Apache . Ils fournissent également une tonne d'exemples en Java!SIGAR == Outil d'information, de collecte et de rapport sur le système.
la source
Il existe un projet Java qui utilise JNA (donc aucune bibliothèque native à installer) et est en développement actif. Il prend actuellement en charge Linux, OSX, Windows, Solaris et FreeBSD et fournit des informations sur la RAM, le processeur, la batterie et le système de fichiers.
la source
Pour les fenêtres, je suis allé de cette façon.
Voici le lien avec les détails.
la source
Vous pouvez obtenir des informations au niveau du système en utilisant
System.getenv()
, en passant le nom de la variable d'environnement appropriée en tant que paramètre. Par exemple, sous Windows:Pour les autres systèmes d'exploitation, la présence / absence et les noms des variables d'environnement pertinentes différeront.
la source
Ajouter une dépendance OSHI via maven:
Obtenez une capacité de batterie restante en pourcentage:
la source
Jetez un œil aux API disponibles dans le package java.lang.management . Par exemple:
OperatingSystemMXBean.getSystemLoadAverage()
ThreadMXBean.getCurrentThreadCpuTime()
ThreadMXBean.getCurrentThreadUserTime()
Il y a aussi plein d'autres choses utiles.
la source
Habituellement, pour obtenir des informations de bas niveau sur le système d'exploitation, vous pouvez appeler des commandes spécifiques au système d'exploitation qui vous donnent les informations souhaitées avec Runtime.exec () ou lire des fichiers tels que / proc / * sous Linux.
la source
L'utilisation du processeur n'est pas simple - java.lang.management via com.sun.management.OperatingSystemMXBean.getProcessCpuTime se rapproche (voir l'excellent extrait de code de Patrick ci-dessus), mais notez qu'il ne donne accès qu'au temps passé par le processeur dans votre processus. il ne vous indiquera pas le temps processeur passé dans d'autres processus, ni même le temps processeur consacré aux activités système liées à votre processus.
par exemple, j'ai un processus java intensif en réseau - c'est la seule chose qui fonctionne et le CPU est à 99% mais seulement 55% de cela est rapporté comme "CPU processeur".
ne me lancez même pas sur la «moyenne de charge» car elle est presque inutile, bien qu'elle soit le seul élément lié au processeur sur le bean MX. si seulement le soleil dans sa sagesse occasionnelle exposait quelque chose comme "getTotalCpuTime" ...
pour une surveillance sérieuse du CPU, SIGAR mentionné par Matt semble le meilleur choix.
la source
Sur
Windows
, vous pouvez exécuter lasysteminfo
commande et récupérer sa sortie par exemple avec le code suivant:la source
Si vous utilisez Jrockit VM, voici une autre façon d'obtenir l'utilisation du processeur VM. Le bean Runtime peut également vous donner une charge CPU par processeur. Je l'ai utilisé uniquement sur Red Hat Linux pour observer les performances de Tomcat. Vous devez activer la télécommande JMX dans catalina.sh pour que cela fonctionne.
la source
Il est encore en cours de développement mais vous pouvez déjà utiliser jHardware
Il s'agit d'une bibliothèque simple qui supprime les données système à l'aide de Java. Il fonctionne à la fois sous Linux et Windows.
la source
Un moyen simple qui peut être utilisé pour obtenir les informations de niveau OS et j'ai testé dans mon Mac qui fonctionne bien:
Vous pouvez trouver de nombreuses mesures pertinentes du système d'exploitation ici
la source
Hé, vous pouvez le faire avec l'intégration java / com. En accédant aux fonctionnalités WMI, vous pouvez obtenir toutes les informations.
la source
Pour obtenir la moyenne de charge système de 1 minute, 5 minutes et 15 minutes à l'intérieur du code java, vous pouvez le faire en exécutant la commande à l'
cat /proc/loadavg
aide et en l'interprétant comme ci-dessous:Et pour obtenir la mémoire du système physique en exécutant la commande
free -m
puis en l'interprétant comme ci-dessous:la source