2016-04-15 12 views
6

Benötigen Sie eine API, um CPU & Speicherverbrauch meines aktuellen Prozesses oder Anwendung in Java. Ich habe eine api CPU-Auslastung des kompletten Systems zu bekommen, aber ich brauche für bestimmte Verfahren. (getSystemCpuLoad von OperatingSystemMXBean Schnittstelle)Java API um CPU & Speicher-Nutzung meiner Java-Anwendung

Vielen Dank im Voraus

+4

Es hängt davon ab, was Sie mit Speichernutzung meinen; meinst du resident memory, virtual memory, haufen im einsatz, live objects, diese können sehr unterschiedlich sein. –

+0

Ich meine Heap im Einsatz. –

+0

Dies kann mit Runtime erhalten werden. totalMemory() - freeMemory() Beachten Sie, dass Sie nicht wissen, wie voll der Heap ist, sondern wie weit Sie vom nächsten vollständigen GC entfernt sind. –

Antwort

4

Es ist die gute Nachricht und die schlechte Nachricht. Die schlechte Nachricht ist, dass eine programmatische Abfrage der CPU-Nutzung mit reinem Java nicht möglich ist. Es gibt einfach keine API dafür. Eine vorgeschlagene Alternative könnte Runtime.exec() verwenden, um die Prozess-ID (PID) der JVM zu ermitteln, einen externen plattformspezifischen Befehl wie ps aufzurufen und ihre Ausgabe für die interessierende PID zu analysieren. Aber dieser Ansatz ist bestenfalls fragil.

Die gute Nachricht ist jedoch, dass eine zuverlässige Lösung erreicht werden kann, indem Sie Java verlassen und ein paar C-Code-Zeilen schreiben, die über Java Native Interface (JNI) in die Java-Anwendung integriert werden.

+0

Wenn Sie wollen, kann ich Ihnen helfen, dies zu erreichen. –

4

Sie können diese Daten erhalten, wenn Sie eine andere OperatingSystemMXBean verwenden. Überprüfen Sie das importierte Paket: com.sun.management.OperatingSystemMXBean.

import java.lang.management.ManagementFactory; 
import com.sun.management.OperatingSystemMXBean; 

public class Test { 

public static void main(String[] args) { 
     OperatingSystemMXBean operatingSystemMXBean = 
      (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 
     System.out.println(operatingSystemMXBean.getProcessCpuLoad()); 
}} 

https://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/OperatingSystemMXBean.html

Wenn ich mich nicht irre, ist diese Klasse in rt.jar enthalten, die in der Java-Laufzeit.

+0

Compilierungsfehler: Die Methode getProcessCpuLoad() ist für den Typ OperatingSystemMXBean nicht definiert. –

+0

@PSM Überprüfen Sie den Import. Sind Sie sicher, dass Sie com.sun.management.OperatingSystemMXBean importieren? – RubioRic

+0

@PSM Ich denke, dass Sie immer noch java.lang.management.OperatingSystemMXBean verwenden – RubioRic