Ich baue derzeit eine Java-App, die möglicherweise auf vielen verschiedenen Plattformen ausgeführt wird, aber hauptsächlich auf Varianten von Solaris, Linux und Windows.
Konnte jemand erfolgreich Informationen wie den aktuell verwendeten Speicherplatz, die CPU-Auslastung und den im zugrunde liegenden Betriebssystem verwendeten Speicher extrahieren? Was ist mit dem, was die Java-App selbst verbraucht?
Am liebsten möchte ich diese Informationen ohne JNI erhalten.
Runtime.getRuntime().freeMemory()
wie in der akzeptierten Antwort vorgeschlagen, gibt Ihnen NICHT die Menge an freiem Speicher.Antworten:
Sie können einige Informationen zum begrenzten Speicher von der Runtime-Klasse erhalten. Es ist wirklich nicht genau das, wonach Sie suchen, aber ich dachte, ich würde es der Vollständigkeit halber bereitstellen. Hier ist ein kleines Beispiel. Bearbeiten: Sie können Informationen zur Datenträgernutzung auch von der Klasse java.io.File abrufen. Für die Speicherplatznutzung ist Java 1.6 oder höher erforderlich.
quelle
Das Paket java.lang.management bietet Ihnen viel mehr Informationen als Runtime - zum Beispiel gibt es Ihnen Heap-Speicher (
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
) getrennt von Nicht-Heap-Speicher (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
).Sie können auch Prozess der CPU - Auslastung (ohne eigenen JNI Code schreiben), aber Sie müssen das werfen ,
java.lang.management.OperatingSystemMXBean
um eincom.sun.management.OperatingSystemMXBean
. Dies funktioniert unter Windows und Linux, ich habe es nicht anderswo getestet.Beispiel: Rufen Sie die Methode get getCpuUsage () häufiger auf, um genauere Messwerte zu erhalten.
quelle
OperatingSystemMXBean
incom.sun.management.OperatingSystemMXBean
und setzen Sie alle Instanzen vongetOperatingSystemMXBean()
mit voranManagementFactory.
. Sie müssen alle Klassen entsprechend importieren.getCpuUsage
, dass das System alle verfügbaren Prozessoren zu 100% verwendet?((double)( processCpuTime - lastProcessCpuTime )) / ((double)( systemTime - lastSystemTime ))
Ich denke, die beste Methode ist die Implementierung der SIGAR-API von Hyperic . Es funktioniert für die meisten gängigen Betriebssysteme (fast alles Moderne) und ist sehr einfach zu handhaben. Die Entwickler reagieren sehr schnell auf ihre Foren und Mailinglisten. Mir gefällt auch, dass es
GPL2Apache lizenziert ist . Sie bieten auch in Java eine Menge Beispiele!SIGAR == Systeminformations-, Erfassungs- und Berichterstellungstool.
quelle
Es gibt ein Java-Projekt, das JNA verwendet (also keine nativen Bibliotheken zu installieren) und sich in der aktiven Entwicklung befindet. Es unterstützt derzeit Linux, OSX, Windows, Solaris und FreeBSD und bietet Informationen zu RAM, CPU, Akku und Dateisystem.
quelle
Für Fenster bin ich diesen Weg gegangen.
Hier ist der Link mit Details.
quelle
Sie können einige Informationen auf Systemebene abrufen
System.getenv()
, indem Sie den entsprechenden Umgebungsvariablennamen als Parameter übergeben. Zum Beispiel unter Windows:Bei anderen Betriebssystemen unterscheiden sich das Vorhandensein / Fehlen und die Namen der relevanten Umgebungsvariablen.
quelle
Fügen Sie die OSHI-Abhängigkeit über maven hinzu:
Erhalten Sie eine verbleibende Batteriekapazität in Prozent:
quelle
Schauen Sie sich die APIs an, die im Paket java.lang.management verfügbar sind . Beispielsweise:
OperatingSystemMXBean.getSystemLoadAverage()
ThreadMXBean.getCurrentThreadCpuTime()
ThreadMXBean.getCurrentThreadUserTime()
Es gibt dort auch viele andere nützliche Dinge.
quelle
Um Informationen zum Betriebssystem auf niedriger Ebene zu erhalten, können Sie normalerweise betriebssystemspezifische Befehle aufrufen, die Ihnen die gewünschten Informationen mit Runtime.exec () geben, oder Dateien wie / proc / * unter Linux lesen.
quelle
Die CPU-Auslastung ist nicht einfach - java.lang.management über com.sun.management.OperatingSystemMXBean.getProcessCpuTime kommt dem nahe (siehe Patricks hervorragendes Code-Snippet oben), aber beachten Sie, dass es nur Zugriff auf die Zeit gibt, die die CPU in Ihrem Prozess verbracht hat. Es gibt keinen Aufschluss über die CPU-Zeit, die in anderen Prozessen verbracht wurde, oder sogar über die CPU-Zeit, die für Systemaktivitäten im Zusammenhang mit Ihrem Prozess aufgewendet wurde.
Zum Beispiel habe ich einen netzwerkintensiven Java-Prozess - es ist das einzige, was läuft und die CPU ist bei 99%, aber nur 55% davon werden als "Prozessor-CPU" gemeldet.
Lassen Sie mich nicht einmal mit "Load Average" anfangen, da es so gut wie nutzlos ist, obwohl es das einzige CPU-bezogene Element auf der MX-Bean ist. wenn nur die Sonne in ihrer gelegentlichen Weisheit etwas wie "getTotalCpuTime" aussetzen würde ...
Für eine ernsthafte CPU-Überwachung scheint das von Matt erwähnte SIGAR die beste Wahl zu sein.
quelle
Ein
Windows
, Sie können densysteminfo
Befehl ausführen und seine Ausgabe beispielsweise mit dem folgenden Code abrufen:quelle
Wenn Sie Jrockit VM verwenden, finden Sie hier eine andere Möglichkeit, die CPU-Auslastung der VM zu ermitteln. Runtime Bean kann Ihnen auch die CPU-Auslastung pro Prozessor geben. Ich habe dies nur unter Red Hat Linux verwendet, um die Leistung von Tomcat zu beobachten. Sie müssen JMX remote in Catalina.sh aktivieren, damit dies funktioniert.
quelle
Es befindet sich noch in der Entwicklung, aber Sie können jHardware bereits verwenden
Es ist eine einfache Bibliothek, die Systemdaten mit Java verschrottet. Es funktioniert sowohl unter Linux als auch unter Windows.
quelle
Ein einfacher Weg, um Informationen auf Betriebssystemebene abzurufen, und den ich auf meinem Mac getestet habe und der gut funktioniert:
Sie können viele relevante Kennzahlen des Betriebssystems finden Sie hier
quelle
Hey, das kannst du mit Java / Com Integration machen. Durch den Zugriff auf WMI-Funktionen erhalten Sie alle Informationen.
quelle
Um den Systemlastdurchschnitt von 1 Minute, 5 Minuten und 15 Minuten innerhalb des Java-Codes zu erhalten, können Sie dies tun, indem Sie den Befehl
cat /proc/loadavg
wie folgt ausführen und interpretieren:Und um den physischen Systemspeicher zu erhalten, indem Sie den Befehl ausführen
free -m
und ihn dann wie folgt interpretieren:quelle