Как я могу проверить использование процессора и памяти в Java? - PullRequest
92 голосов
/ 16 сентября 2008

Мне нужно проверить использование процессора и памяти для сервера в Java, кто-нибудь знает, как это можно сделать?

Ответы [ 15 ]

69 голосов
/ 16 сентября 2008

Если вы ищете специально в памяти 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/>");

Тем не менее, они должны быть приняты только в качестве оценки ...

19 голосов
/ 23 января 2012
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();
    }
}
17 голосов
/ 16 сентября 2008

Если вы используете Sun JVM и заинтересованы в использовании внутренней памяти приложения (сколько из выделенной памяти использует ваше приложение), я предпочитаю включать ведение журнала сбора мусора JVM. Вы просто добавляете -verbose: gc к команде запуска.

Из Солнца документация:

Аргумент командной строки -verbose: gc печатает информацию при каждом коллекция. Обратите внимание, что формат вывода -verbose: gc подчинен переключаться между выпусками платформы J2SE. Например, вот вывод из большого серверного приложения:

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

Здесь мы видим две второстепенные коллекции и одну главную. Число до и после стрелки

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

указывает объединенный размер живых объектов до и после мусора коллекция соответственно. После незначительных коллекций количество включает объекты, которые не обязательно живы, но не могут быть восстановлены, либо потому что они непосредственно живы, или потому что они находятся внутри или ссылается на штатное поколение. Число в скобках

(776768K) (in the first line)

- это общее доступное пространство, не считая места в постоянном поколение, которое является общей кучей минус один из оставшихся в живых пространств. Незначительная коллекция заняла около четверти секунды.

0.2300771 secs (in the first line)

Подробнее см .: http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

15 голосов
/ 31 марта 2013

С здесь

    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);
9 голосов
/ 16 сентября 2008

JMX, предоставленные MXBean (ThreadMXBean и т. Д.) Дадут вам использование памяти и ЦП.

OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
operatingSystemMXBean.getSystemCpuLoad();
8 голосов
/ 16 сентября 2008

Для использования памяти будет работать следующее,

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

Для использования процессора вам понадобится внешнее приложение для его измерения.

5 голосов
/ 16 сентября 2008

Начиная с Java 1.5, JDK поставляется с новым инструментом: JConsole , который может показать вам использование процессора и памяти для любой 1.5 или более поздней JVM. Он может делать диаграммы этих параметров, экспортировать в CSV, показывать количество загруженных классов, количество экземпляров, взаимоблокировок, потоков и т. Д. *

4 голосов
/ 16 сентября 2008

Если вы используете решение runtime / totalMemory, которое было опубликовано здесь во многих ответах (я много делал), сначала обязательно запустите две сборки мусора, если вы хотите довольно точные / согласованные результаты.

Для эффективности Java обычно позволяет мусору заполнить всю память перед принудительным сбором GC, и даже тогда это обычно не полный сборщик мусора, поэтому ваши результаты для runtime.freeMemory () всегда будут где-то между "реальным" количеством свободного память и 0.

Первый GC не получает всего, он получает большую часть.

Подъем в том, что если вы просто сделаете вызов freeMemory (), вы получите абсолютно бесполезный номер, который варьируется в широких пределах, но если сначала сделать 2 gc, это очень надежный индикатор. Это также делает процедуру НАМНОГО медленнее (возможно, в секундах).

3 голосов
/ 16 сентября 2008

Java Runtime объект может сообщать об использовании памяти JVM. Для использования процессора вам нужно будет использовать внешнюю утилиту, такую ​​как Unix top или Windows Process Manager.

2 голосов
/ 02 июля 2015

Я бы также добавил следующий способ отслеживания загрузки процессора:

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

Вы можете прочитать больше здесь

...