J'écris un programme en Java pour afficher périodiquement l'utilisation du CPU et de la mémoire d'un ID de processus donné. Mon implémentation appelle la liste des tâches. Il est assez simple d'obtenir l'utilisation de la mémoire par la commande suivante:
tasklist /fi "memusage ge 0" /fi "pid eq 2076" /v
Cela renverra l'utilisation de la mémoire du processus id 2076 et je peux l'utiliser pour ma tâche. En appelant la commande suivante, je peux extraire le temps CPU.
tasklist /fi "pid eq 2076" /fi "CPUTIME ge 00:00:00" /v
Ma question est, comment pourrais-je obtenir l'utilisation du processeur de ce processus?
J'ai trouvé un message sur StackOverflow pour ma question mais la réponse n'est pas claire et je ne comprends pas quoi taper dans la commande pour obtenir ce dont j'ai besoin. La question a été répondue en 2008 et quelqu'un a demandé des éclaircissements en 2013, mais la personne qui a répondu à la question n'a pas répondu.
Ici est le message que j'ai trouvé.
J'ai écrit une fois une classe:
private static class PerformanceMonitor {
private int availableProcessors = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
private long lastSystemTime = 0;
private long lastProcessCpuTime = 0;
/**
* Get's the cpu usage of the jvm
*
* @return the cpu usage a double of percentage
*/
private synchronized double getCpuUsage() {
if (lastSystemTime == 0) {
baselineCounters();
return 0d;
}
long systemTime = System.nanoTime();
long processCpuTime = 0;
if (getOperatingSystemMXBean() instanceof com.Sun.management.OperatingSystemMXBean) {
processCpuTime = ((com.Sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getProcessCpuTime();
}
double cpuUsage = ((double) (processCpuTime - lastProcessCpuTime)) / ((double) (systemTime - lastSystemTime));
lastSystemTime = systemTime;
lastProcessCpuTime = processCpuTime;
return cpuUsage / availableProcessors;
}
private void baselineCounters() {
lastSystemTime = System.nanoTime();
if (getOperatingSystemMXBean() instanceof com.Sun.management.OperatingSystemMXBean) {
lastProcessCpuTime = ((com.Sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getProcessCpuTime();
}
}
}
Qui s'utilise comme:
private static final PerformanceMonitor _MONITOR = new PerformanceMonitor();
_MONITOR.getCpuUsage();
Cela affiche l'utilisation de l'unité centrale consommée par le processus de cette machine virtuelle Java.