web-dev-qa-db-fra.com

Comment vérifier l'utilisation du processeur et de la mémoire en Java?

J'ai besoin de vérifier l'utilisation du processeur et de la mémoire pour le serveur en Java, tout le monde sait comment cela peut être fait?

93
Johnny Bou

Si vous recherchez spécifiquement de la mémoire dans la machine virtuelle Java:

Runtime runtime = Runtime.getRuntime();

NumberFormat format = NumberFormat.getInstance();

StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();

sb.append("free memory: " + format.format(freeMemory / 1024) + "<br/>");
sb.append("allocated memory: " + format.format(allocatedMemory / 1024) + "<br/>");
sb.append("max memory: " + format.format(maxMemory / 1024) + "<br/>");
sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024) + "<br/>");

Cependant, ceux-ci ne doivent être pris que comme une estimation ...

69
Jeremy
package mkd.Utils;

import Java.io.File;
import Java.text.NumberFormat;

public class systemInfo {

    private Runtime runtime = Runtime.getRuntime();

    public String Info() {
        StringBuilder sb = new StringBuilder();
        sb.append(this.OsInfo());
        sb.append(this.MemInfo());
        sb.append(this.DiskInfo());
        return sb.toString();
    }

    public String OSname() {
        return System.getProperty("os.name");
    }

    public String OSversion() {
        return System.getProperty("os.version");
    }

    public String OsArch() {
        return System.getProperty("os.Arch");
    }

    public long totalMem() {
        return Runtime.getRuntime().totalMemory();
    }

    public long usedMem() {
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
    }

    public String MemInfo() {
        NumberFormat format = NumberFormat.getInstance();
        StringBuilder sb = new StringBuilder();
        long maxMemory = runtime.maxMemory();
        long allocatedMemory = runtime.totalMemory();
        long freeMemory = runtime.freeMemory();
        sb.append("Free memory: ");
        sb.append(format.format(freeMemory / 1024));
        sb.append("<br/>");
        sb.append("Allocated memory: ");
        sb.append(format.format(allocatedMemory / 1024));
        sb.append("<br/>");
        sb.append("Max memory: ");
        sb.append(format.format(maxMemory / 1024));
        sb.append("<br/>");
        sb.append("Total free memory: ");
        sb.append(format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));
        sb.append("<br/>");
        return sb.toString();

    }

    public String OsInfo() {
        StringBuilder sb = new StringBuilder();
        sb.append("OS: ");
        sb.append(this.OSname());
        sb.append("<br/>");
        sb.append("Version: ");
        sb.append(this.OSversion());
        sb.append("<br/>");
        sb.append(": ");
        sb.append(this.OsArch());
        sb.append("<br/>");
        sb.append("Available processors (cores): ");
        sb.append(runtime.availableProcessors());
        sb.append("<br/>");
        return sb.toString();
    }

    public String DiskInfo() {
        /* Get a list of all filesystem roots on this system */
        File[] roots = File.listRoots();
        StringBuilder sb = new StringBuilder();

        /* For each filesystem root, print some info */
        for (File root : roots) {
            sb.append("File system root: ");
            sb.append(root.getAbsolutePath());
            sb.append("<br/>");
            sb.append("Total space (bytes): ");
            sb.append(root.getTotalSpace());
            sb.append("<br/>");
            sb.append("Free space (bytes): ");
            sb.append(root.getFreeSpace());
            sb.append("<br/>");
            sb.append("Usable space (bytes): ");
            sb.append(root.getUsableSpace());
            sb.append("<br/>");
        }
        return sb.toString();
    }
}
19
Dave

Si vous utilisez la machine virtuelle Sun et êtes intéressé par l'utilisation de la mémoire interne de l'application (combien de mémoire allouée votre application utilise-t-elle), je préfère activer la journalisation de la récupération de place intégrée dans la machine virtuelle Java. Vous ajoutez simplement -verbose: gc à la commande de démarrage.

De la documentation Sun:

L'argument de ligne de commande -verbose: gc imprime des informations sur chaque collection. Notez que le format de la sortie -verbose: gc est susceptible de changer entre les versions de la plate-forme J2SE. Par exemple, voici la sortie d’une grande application serveur:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

Nous voyons ici deux collections mineures et une majeure. Les chiffres avant et après la flèche

325407K->83000K (in the first line)

indique la taille combinée des objets vivants avant et après la récupération de place, respectivement. Après les collections mineures, le nombre inclut des objets qui ne sont pas nécessairement vivants mais qui ne peuvent pas être récupérés, soit parce qu'ils sont directement vivants, soit parce qu'ils sont dans la génération permanente ou qu'ils sont référencés. Le nombre entre parenthèses

(776768K) (in the first line)

est l'espace total disponible, sans compter l'espace de la génération permanente, qui correspond au tas total moins un des espaces survivants. La collecte mineure a pris environ un quart de seconde.

0.2300771 secs (in the first line)

Pour plus d'informations, voir: http://Java.Sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

17
unknown (yahoo)

De ici

    OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
    int availableProcessors = operatingSystemMXBean.getAvailableProcessors();
    long prevUpTime = runtimeMXBean.getUptime();
    long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
    double cpuUsage;
    try
    {
        Thread.sleep(500);
    }
    catch (Exception ignored) { }

    operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    long upTime = runtimeMXBean.getUptime();
    long processCpuTime = operatingSystemMXBean.getProcessCpuTime();
    long elapsedCpu = processCpuTime - prevProcessCpuTime;
    long elapsedTime = upTime - prevUpTime;

    cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * availableProcessors));
    System.out.println("Java CPU: " + cpuUsage);
15
danieln

JMX, les MXBeans (ThreadMXBean, etc.) fournis vous indiqueront les utilisations de la mémoire et du processeur.

OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
operatingSystemMXBean.getSystemCpuLoad();
9
Javamann

Pour l’utilisation de la mémoire, ce qui suit fonctionnera,

long total = Runtime.getRuntime().totalMemory();
long used  = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

Pour utiliser le processeur, vous devez utiliser une application externe pour le mesurer.

8
Rich Adams

Depuis Java 1.5, le JDK est livré avec un nouvel outil: JConsole qui peut vous montrer l’utilisation de la CPU et de la mémoire de toute machine virtuelle Java 1.5 ou plus récente. Il peut en faire des graphiques. paramètres, exportation au format CSV, affichage du nombre de classes chargées, du nombre d'instances, d'interblocages, de threads, etc.

5
Telcontar

Si vous utilisez la solution runtime/totalMemory qui a été publiée dans de nombreuses réponses ici (je l'ai souvent fait), veillez à forcer d'abord deux collectes de mémoire si vous souhaitez obtenir des résultats assez précis/cohérents.

Pour des raisons d'efficacité Java permet généralement à Garbage de remplir toute la mémoire avant de forcer un GC, et même dans ce cas, il ne s'agit généralement pas d'un GC complet; vos résultats pour runtime.freeMemory () se situent toujours entre les "réelle" quantité de mémoire libre et 0.

Le premier GC ne comprend pas tout, il en tire le maximum.

L’essor est que si vous ne faites que l’appel freeMemory (), vous obtiendrez un numéro absolument inutile et très variable, mais si vous faites tout d’abord 2 gc, c’est un indicateur très fiable. Cela ralentit aussi BEAUCOUP la routine (quelques secondes éventuellement).

4
Bill K

L'objet Runtime de Java peut signaler l'utilisation de la mémoire de la machine virtuelle Java. Pour utiliser le processeur, vous devrez utiliser un utilitaire externe, tel que le gestionnaire principal d'Unix ou Windows Process Manager.

3
moonshadow

Voici un code simple pour calculer l'utilisation actuelle de la mémoire en mégaoctets:

double currentMemory = ( (double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024));
2
Phil

J'ajouterais également le moyen suivant pour suivre la charge du processeur:

import Java.lang.management.ManagementFactory;
import com.Sun.management.OperatingSystemMXBean;

double getCpuLoad() {
    OperatingSystemMXBean osBean =
        (com.Sun.management.OperatingSystemMXBean) ManagementFactory.
        getPlatformMXBeans(OperatingSystemMXBean.class);
    return osBean.getProcessCpuLoad();
}

Vous pouvez en lire plus ici

2
sbeliakov

JConsole est un moyen facile de surveiller une application en cours d'exécution Java ou vous pouvez utiliser un profileur pour obtenir des informations plus détaillées sur votre application. J'aime utiliser le NetBeans Profiler pour cela.

1
blahspam

Le profileur YourKit Java est une excellente solution commerciale. Vous pouvez trouver de plus amples informations dans la documentation sur profilage du processeur et mémoire profilage .

1
Gregg

Si vous utilisez Tomcat, consultez Psi Probe , qui vous permet de surveiller la consommation de mémoire interne et externe ainsi que de nombreuses autres zones.

1
Tim Howland

Pour Eclipse, vous pouvez utiliser TPTP (plate-forme d’outils de test et de performance) pour analyser l’utilisation de la mémoire, etc. plus d’informations

0
Fuangwith S.