105 votes

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

J'ai besoin de vérifier l'utilisation du CPU et de la mémoire pour le serveur en java, quelqu'un sait comment faire ?

0 votes

1 votes

78voto

Jeremy Points 1428

Si vous recherchez spécifiquement la mémoire dans la JVM :

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/>");

Toutefois, il ne s'agit que d'une estimation...

0 votes

Donc, si je fonctionne dans Eclipse, cela dépendra de mes paramètres Eclipse ?

4 votes

Notez que ce n'est pas la mémoire réellement utilisée - c'est la 'mémoire allouée' qui signifie le tas que java a alloué, donc si vous avez -Xms90g et que votre application est très légère, vous aurez toujours allocatedMemory comme quelque chose de plus grand que 90g. Voir la réponse de la personne supprimée "unknown (yahoo)" ci-dessous (qui peut être différente à première vue)

0 votes

Par simple curiosité, pourquoi ne s'agit-il que d'une estimation ?

23voto

Dave Points 89
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();
    }
}

1 votes

Si j'ai bien compris, le sujet de départ concernait la quantité de mémoire disponible dans le système d'exploitation. freeMemory ici renvoie la quantité de mémoire disponible dans la JVM, ce qui est très différent.

4 votes

N'est-il pas étrange que votre classe SystemInfo ne commence pas par une capitale et que vos méthodes Info(), OSname() , MemInfo() le fassent ?

17voto

jodonnell Points 14999

Cette question a de bonnes informations que vous devriez trouver utiles.

17voto

danieln Points 929

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);

2 votes

List<MemoryPoolMXBean> memoryPools = new ArrayList<MemoryPoolMXBean>(ManagementFactory.getMemoryPoolMXBeans()) ; long usedHeapMemoryAfterLastGC = 0 ; for (MemoryPoolMXBean memoryPool : memoryPools) { if (memoryPool.getType().equals(MemoryType.HEAP)) { MemoryUsage poolCollectionMemoryUsage = memoryPool.getCollectionUsage() ; usedHeapMemoryAfterLastGC += poolCollectionMemoryUsage.getUsed() ; } }

1 votes

Merci pour la seule réponse montrant la récupération de l'utilisation du CPU.

1 votes

Quelle est la différence entre faire cela et faire simplement operatingSystemMXBean.getProcessCpuLoad(); ? Selon la documentation d'Oracle, cette méthode renvoie "Renvoie la "récente utilisation du cpu" pour le processus de la machine virtuelle Java". Pourtant, je vois une différence de nombre relativement importante entre votre méthode et cette méthode.

11voto

Javamann Points 1937

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

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

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