it-swarm-eu.dev

Wie überprüfe ich die CPU- und Speichernutzung in Java?

Ich muss die CPU- und Speicherauslastung für den Server in Java überprüfen. Weiß jemand, wie dies erfolgen kann?

93
Johnny Bou

Wenn Sie speziell nach Speicher in JVM suchen:

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

Diese sind jedoch nur als Schätzung zu verstehen ...

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

Wenn Sie die Sun JVM verwenden und an der internen Speichernutzung der Anwendung interessiert sind (wie viel Speicherplatz Ihre App belegt), ziehe ich es vor, die integrierte Garbage Collection-Protokollierung der JVM zu aktivieren. Sie fügen einfach -verbose: gc zum Startbefehl hinzu.

Aus der Sun-Dokumentation:

Das Befehlszeilenargument -verbose: gc gibt Informationen zu jeder Sammlung aus. Beachten Sie, dass sich das Format der Ausgabe von -verbose: gc zwischen den Releases der J2SE-Plattform ändern kann. Beispiel: Hier wird von einer großen Serveranwendung ausgegeben:

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

Hier sehen wir zwei kleinere Sammlungen und eine größere. Die Zahlen vor und nach dem Pfeil

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

geben Sie die kombinierte Größe von Live-Objekten vor bzw. nach der Speicherbereinigung an. Nach kleineren Sammlungen enthält die Zählung Objekte, die nicht unbedingt lebendig sind, aber nicht zurückgefordert werden können, weil sie entweder direkt lebendig sind oder weil sie sich innerhalb der vergebenen Generation befinden oder auf diese verwiesen wird. Die Zahl in Klammern

(776768K) (in the first line)

ist der insgesamt verfügbare Speicherplatz, ohne den Speicherplatz in der permanenten Generation, der sich aus dem gesamten Haufen abzüglich eines der überlebenden Speicherplätze zusammensetzt. Die kleine Sammlung dauerte ungefähr eine Viertelsekunde.

0.2300771 secs (in the first line)

Weitere Informationen finden Sie unter: http://Java.Sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

17
unknown (yahoo)

Von hier

    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, die bereitgestellten MXBeans (ThreadMXBean usw.) geben Ihnen Speicher- und CPU-Auslastung.

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

Für die Speichernutzung funktioniert Folgendes:

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

Für die CPU-Auslastung müssen Sie eine externe Anwendung verwenden, um sie zu messen.

8
Rich Adams

Seit Java 1.5) wird das JDK mit einem neuen Tool ausgeliefert: JConsole , mit dem Sie die CPU- und Speichernutzung einer beliebigen JVM ab 1.5 anzeigen können Parameter, Export nach CSV, Anzahl der geladenen Klassen, Anzahl der Instanzen, Deadlocks, Threads usw.

5
Telcontar

Wenn Sie die Runtime/TotalMemory-Lösung verwenden, die in vielen Antworten hier veröffentlicht wurde (das habe ich sehr oft getan), müssen Sie zuerst zwei Garbage Collections erzwingen, wenn Sie ziemlich genaue/konsistente Ergebnisse erzielen möchten.

Für die Effizienz Java ermöglicht es normalerweise, dass der Müll den gesamten Speicher füllt, bevor ein GC erzwungen wird, und selbst dann ist es normalerweise kein vollständiger GC, sodass Ihre Ergebnisse für runtime.freeMemory () immer irgendwo zwischen dem "echte" Menge an freiem Speicher und 0.

Der erste GC bekommt nicht alles, er bekommt das meiste.

Der Aufschwung ist, dass Sie, wenn Sie nur den freeMemory () -Aufruf ausführen, eine Zahl erhalten, die absolut nutzlos ist und stark variiert. Wenn Sie jedoch zuerst 2 gc ausführen, ist dies eine sehr zuverlässige Anzeige. Es macht auch die Routine viel langsamer (Sekunden, möglicherweise).

4
Bill K

Das Objekt Runtime von Java kann die Speichernutzung der JVM melden. Für die CPU-Auslastung müssen Sie ein externes Dienstprogramm wie Unix's Top oder Windows Process Manager verwenden.

3
moonshadow

Hier ist ein einfacher Code zur Berechnung der aktuellen Speichernutzung in Megabyte:

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

Ich würde auch die folgende Möglichkeit hinzufügen, um die CPU-Last zu verfolgen:

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

Sie können mehr lesen hier

2
sbeliakov

JConsole ist eine einfache Möglichkeit, eine laufende Java) -Anwendung zu überwachen, oder Sie können einen Profiler verwenden, um detailliertere Informationen zu erhalten Ich benutze dafür gerne den NetBeans Profiler .

1
blahspam

Der Profiler YourKit Java) stellt eine hervorragende kommerzielle Lösung dar. Weitere Informationen finden Sie in den Dokumenten zu CPU-Profilerstellung und Speicher) Profiling .

1
Gregg

Wenn Sie Tomcat verwenden, lesen Sie Psi Probe , mit dem Sie den internen und externen Speicherverbrauch sowie eine Vielzahl anderer Bereiche überwachen können.

1
Tim Howland

Für Eclipse können Sie TPTP (Test and Performance Tools Platform) zum Analysieren der Speichernutzung usw. verwenden. Weitere Informationen

0
Fuangwith S.