Ich möchte die folgenden Systeminformationen in Java überwachen:
- Aktuelle CPU-Auslastung ** (Prozent)
- Verfügbarer Speicher * (frei / insgesamt)
Verfügbarer Speicherplatz (frei / insgesamt)
* Beachten Sie, dass ich den Gesamtspeicher meine, der dem gesamten System zur Verfügung steht, nicht nur der JVM.
Ich suche nach einer plattformübergreifenden Lösung (Linux, Mac und Windows), die nicht auf meinem eigenen Code basiert, der externe Programme aufruft oder JNI verwendet. Obwohl dies praktikable Optionen sind, würde ich es vorziehen, den betriebssystemspezifischen Code nicht selbst zu pflegen, wenn jemand bereits eine bessere Lösung hat.
Wenn es eine kostenlose Bibliothek gibt, die dies zuverlässig und plattformübergreifend tut, wäre das großartig (selbst wenn sie externe Anrufe tätigt oder nativen Code selbst verwendet).
Anregungen werden sehr geschätzt.
Zur Verdeutlichung möchte ich die aktuelle CPU-Auslastung für das gesamte System ermitteln, nicht nur für die Java-Prozesse.
Die SIGAR-API bietet alle Funktionen, die ich suche, in einem Paket, sodass sie die bisher beste Antwort auf meine Frage ist. Da es jedoch unter der GPL lizenziert ist, kann ich es nicht für meinen ursprünglichen Zweck verwenden (ein geschlossenes, kommerzielles Produkt). Es ist möglich, dass Hyperic SIGAR für die kommerzielle Nutzung lizenziert, aber ich habe es nicht untersucht. Für meine GPL-Projekte werde ich in Zukunft definitiv SIGAR in Betracht ziehen.
Für meine aktuellen Bedürfnisse neige ich zu Folgendem:
- Für die CPU-Auslastung
OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors()
(Lastdurchschnitt pro CPU) - Für die Erinnerung
OperatingSystemMXBean.getTotalPhysicalMemorySize()
undOperatingSystemMXBean.getFreePhysicalMemorySize()
- Für Speicherplatz
File.getTotalSpace()
undFile.getUsableSpace()
Einschränkungen:
Die getSystemLoadAverage()
Abfragemethoden und Speicherplatz sind nur unter Java 6 verfügbar. Außerdem sind einige JMX-Funktionen möglicherweise nicht für alle Plattformen verfügbar (dh es wurde berichtet, dass dies der Fall istgetSystemLoadAverage()
unter Windows -1 zurückgegeben wird).
Obwohl ursprünglich unter GPL lizenziert, wurde es in Apache 2.0 geändert , das im Allgemeinen für kommerzielle Closed-Source-Produkte verwendet werden kann.
Antworten:
In Anlehnung an das, was ich in diesem Beitrag erwähnt habe . Ich empfehle Ihnen, die SIGAR-API zu verwenden . Ich verwende die SIGAR-API in einer meiner eigenen Anwendungen und sie ist großartig. Sie werden feststellen, dass es stabil, gut unterstützt und voller nützlicher Beispiele ist. Es ist Open Source mit einer
GPL 2Apache 2.0-Lizenz. Hör zu. Ich habe das Gefühl, es wird Ihren Bedürfnissen entsprechen.Mit Java und der Sigar-API können Sie Speicher, CPU, Festplatte, Lastdurchschnitt, Informationen und Metriken zur Netzwerkschnittstelle, Informationen zur Prozesstabelle, Routeninformationen usw. abrufen.
quelle
Das Folgende bringt Ihnen angeblich CPU und RAM. Weitere Informationen finden Sie unter ManagementFactory .
quelle
In JDK 1.7 können Sie die CPU- und Speicherauslastung des Systems über abrufen
com.sun.management.OperatingSystemMXBean
. Das ist anders alsjava.lang.management.OperatingSystemMXBean
.quelle
Dies funktioniert für mich perfekt ohne externe API, nur native Java versteckte Funktion :)
quelle
Schauen Sie sich diesen sehr detaillierten Artikel an: http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclasstogetJVMCPUtime
Um den Prozentsatz der verwendeten CPU zu ermitteln, benötigen Sie lediglich einige einfache Berechnungen:
Hinweis: Sie müssen importieren
com.sun.management.OperatingSystemMXBean
und nichtjava.lang.management.OperatingSystemMXBean
.quelle
Wenn Sie über Java 6 verfügen, können Sie für den Speicherplatz die Methoden getTotalSpace und getFreeSpace für File verwenden. Wenn Sie nicht mit Java 6 arbeiten, können Sie meines Erachtens Apache Commons IO verwenden , um einen Teil des Weges dorthin zu finden.
Ich kenne keine plattformübergreifende Methode, um die CPU- oder Speicherauslastung zu ermitteln, fürchte ich.
quelle
Vieles davon ist bereits über JMX verfügbar. In Java 5 ist JMX integriert und enthält einen JMX-Konsolen-Viewer mit dem JDK.
Sie können JMX verwenden, um manuell zu überwachen, oder JMX-Befehle von Java aus aufrufen, wenn Sie diese Informationen in Ihrer eigenen Laufzeit benötigen.
quelle
Die akzeptierte Antwort im Jahr 2008 empfahl SIGAR. In einem Kommentar aus dem Jahr 2014 (@Alvaro) heißt es jedoch:
Meine Empfehlung ist, https://github.com/oshi/oshi zu verwenden
Oder die oben erwähnte Antwort .
quelle
quelle
Der folgende Code ist nur Linux (möglicherweise Unix), funktioniert jedoch in einem realen Projekt.
quelle
Erstellen Sie eine Batch-Datei "Pc.bat" als, geben Sieperf -sc 1 "\ mukit \ processor (_Total) \ %% Processor Time" ein.
Sie können die Klasse MProcess verwenden,
}}
Nach einigen String-Manipulationen erhalten Sie dann die CPU-Auslastung. Sie können den gleichen Prozess für andere Aufgaben verwenden.
- Mukit Hasan
quelle
typeperf "\processor(_total)\% processor time"
Wenn Sie sie in eine Batch-Datei einfügen, verwenden Sie %% anstelle von%. Ich habe technet.microsoft.com/en-us/library/bb490960.aspx verwendet .