Как проверить использование процессора и памяти в Java?

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Из документации Sun:

Аргумент командной строки -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

Ответ 4

От здесь

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

Ответ 5

JMX, предоставленные MXBeans (ThreadMXBean и т.д.) предоставят вам использование памяти и процессора.

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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

Ответ 10

Вот простой код для вычисления текущего использования памяти в мегабайтах:

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

Ответ 11

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

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

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

Ответ 12

Если вы используете Tomcat, проверьте Psi Probe, который позволяет отслеживать потребление внутренней и внешней памяти, а также множество других области.

Ответ 13

JConsole - это простой способ отслеживать запущенное приложение Java, или вы можете использовать Profiler для получения более подробной информации о вашем приложении, Мне нравится использовать NetBeans Profiler для этого.