Frage

Ich bin derzeit eine Java-Anwendung erstellen, die auf vielen verschiedenen Plattformen laufen könnten am Ende ist, sondern in erster Linie Varianten von Solaris, Linux und Windows.

Hat jemand in der Lage gewesen, erfolgreich in dem zugrunde liegenden Betriebssystem verwendet, um Informationen wie der aktuellen Speicherplatz verwendet, die CPU-Auslastung und Speicher zu extrahieren? Was ist genau das, was der Java-App selbst verbraucht?

Vorzugsweise würde Ich mag diese Informationen zu erhalten, ohne JNI.

War es hilfreich?

Lösung

Sie können eine begrenzte Speicherinformation aus der Runtime-Klasse erhalten. Es ist wirklich nicht genau das, was Sie suchen, aber ich dachte, dass ich es aus Gründen der Vollständigkeit bieten würde. Hier ist ein kleines Beispiel. Edit: Sie können auch Plattennutzungsinformationen aus der Klasse java.io.File erhalten. Der Speicherplatzbedarf Sachen erfordert Java 1.6 oder höher.

public class Main {
  public static void main(String[] args) {
    /* Total number of processors or cores available to the JVM */
    System.out.println("Available processors (cores): " + 
        Runtime.getRuntime().availableProcessors());

    /* Total amount of free memory available to the JVM */
    System.out.println("Free memory (bytes): " + 
        Runtime.getRuntime().freeMemory());

    /* This will return Long.MAX_VALUE if there is no preset limit */
    long maxMemory = Runtime.getRuntime().maxMemory();
    /* Maximum amount of memory the JVM will attempt to use */
    System.out.println("Maximum memory (bytes): " + 
        (maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));

    /* Total memory currently available to the JVM */
    System.out.println("Total memory available to JVM (bytes): " + 
        Runtime.getRuntime().totalMemory());

    /* Get a list of all filesystem roots on this system */
    File[] roots = File.listRoots();

    /* For each filesystem root, print some info */
    for (File root : roots) {
      System.out.println("File system root: " + root.getAbsolutePath());
      System.out.println("Total space (bytes): " + root.getTotalSpace());
      System.out.println("Free space (bytes): " + root.getFreeSpace());
      System.out.println("Usable space (bytes): " + root.getUsableSpace());
    }
  }
}

Andere Tipps

Die java.lang.management Paket erhalten Sie eine ganze Menge mehr Informationen als Runtime nicht geben -. zum Beispiel wird es Ihnen Speicher geben Heap (ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()) getrennt von nicht-Heap-Speicher (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage())

Sie können auch Prozess der CPU-Auslastung (ohne das Schreiben eigenen JNI-Code) bekommen, aber Sie müssen die java.lang.management.OperatingSystemMXBean zu einem com.sun.management.OperatingSystemMXBean werfen. Dies funktioniert unter Windows und Linux, ich habe es an anderer Stelle nicht getestet.

Zum Beispiel ... rufen Sie das bekommen getCpuUsage () Methode häufiger genauere Messwerte zu erhalten.

public class PerformanceMonitor { 
    private int  availableProcessors = getOperatingSystemMXBean().getAvailableProcessors();
    private long lastSystemTime      = 0;
    private long lastProcessCpuTime  = 0;

    public synchronized double getCpuUsage()
    {
        if ( lastSystemTime == 0 )
        {
            baselineCounters();
            return;
        }

        long systemTime     = System.nanoTime();
        long processCpuTime = 0;

        if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
        {
            processCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
        }

        double cpuUsage = (double) ( processCpuTime - lastProcessCpuTime ) / ( systemTime - lastSystemTime );

        lastSystemTime     = systemTime;
        lastProcessCpuTime = processCpuTime;

        return cpuUsage / availableProcessors;
    }

    private void baselineCounters()
    {
        lastSystemTime = System.nanoTime();

        if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
        {
            lastProcessCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
        }
    }
}

Ich denke, die beste Methode, da draußen zu implementieren, ist die SIGAR API von Hyperic . Es funktioniert für die meisten der gängigen Betriebssysteme (darn in der Nähe alles, was modern) und ist sehr einfach zu handhaben. Der Entwickler (s) ist sehr reaktionsschnell auf ihrem Forum und Mailinglisten. Ich mag auch, dass es GPL2 Apache lizenziert . Sie bieten eine Tonne Beispiele in Java auch!

SIGAR == Systeminformationen sammeln und Reporting-Tool.

Es ist ein Java-Projekt, das JNA verwendet (also keine nativen Bibliotheken installieren) und ist in der aktiven Entwicklung. Es unterstützt derzeit Linux, OSX, Windows, Solaris und FreeBSD und bietet RAM, CPU, Batterie und Dateisysteminformationen.

Sie können einige System-Level-Informationen erhalten, indem System.getenv() verwenden, den entsprechenden Umgebungsvariable Namen als Parameter übergeben. Zum Beispiel unter Windows:

System.getenv("PROCESSOR_IDENTIFIER")
System.getenv("PROCESSOR_ARCHITECTURE")
System.getenv("PROCESSOR_ARCHITEW6432")
System.getenv("NUMBER_OF_PROCESSORS")

Für andere Betriebssysteme das Vorhandensein / Fehlen und die Namen der relevanten Umgebungsvariablen unterscheiden.

Für Fenster ging ich auf diese Weise.

    com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();

    long physicalMemorySize = os.getTotalPhysicalMemorySize();
    long freePhysicalMemory = os.getFreePhysicalMemorySize();
    long freeSwapSize = os.getFreeSwapSpaceSize();
    long commitedVirtualMemorySize = os.getCommittedVirtualMemorySize();

Hier ist der Link mit Details.

OSHI Abhängigkeit über Maven hinzufügen:

<dependency>
    <groupId>com.github.dblock</groupId>
    <artifactId>oshi-core</artifactId>
    <version>2.2</version>
</dependency>

Hier finden Sie eine Batteriekapazität in Prozent links:

SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
for (PowerSource pSource : hal.getPowerSources()) {
    System.out.println(String.format("%n %s @ %.1f%%", pSource.getName(), pSource.getRemainingCapacity() * 100d));
}

Haben Sie einen Blick auf die verfügbaren APIs in der java.lang.management Paket. Zum Beispiel:

  • OperatingSystemMXBean.getSystemLoadAverage()
  • ThreadMXBean.getCurrentThreadCpuTime()
  • ThreadMXBean.getCurrentThreadUserTime()

Es gibt viele andere nützliche Dinge in dort.

Normalerweise auf niedrigem Niveau OS Informationen zu erhalten, können Sie OS-spezifische Befehle aufrufen, die Ihnen die Informationen die Sie Runtime.exec wollen () oder lesen Dateien wie / proc / * in Linux.

CPU-Auslastung ist nicht einfach - java.lang.management über com.sun.management.OperatingSystemMXBean.getProcessCpuTime nahe kommt (Patrick hervorragender Code-Schnipsel siehe oben), aber beachten Sie, dass es nur den Zugang zu Zeit gibt die CPU ausgegeben in Ihrem Prozess. es wird nicht über die CPU-Zeit in anderen Prozessen ausgegeben sagen, oder sogar verbrachte CPU-Zeit für Ihren Prozess bezogenes System Aktivitäten.

zum Beispiel habe ich ein netzwerkintensive Java-Prozess - es ist das einzige, was läuft und die CPU ist bei 99%, aber nur 55% davon wird als „Prozessor CPU“ berichtet,

.

Sie bekommen nicht einmal begonnen, mich auf „load average“, wie es nutzlos als nächstes, trotz das einzige CPU bezogen sein Element auf dem MX-Bean. wenn nur Sonne in ihrer gelegentlichen Weisheit ausgesetzt so etwas wie „getTotalCpuTime“ ...

für schwere CPU-Überwachung SIGAR von Matt erwähnt scheint die beste Wahl.

Es ist noch in der Entwicklung, aber Sie können bereits verwenden jHardware

Es ist eine einfache Bibliothek, die Schrotte Systemdaten mit Hilfe von Java. Es funktioniert in Linux und Windows.

ProcessorInfo info = HardwareInfo.getProcessorInfo();
//Get named info
System.out.println("Cache size: " + info.getCacheSize());        
System.out.println("Family: " + info.getFamily());
System.out.println("Speed (Mhz): " + info.getMhz());
//[...]

Wenn Sie JRockit VM verwenden, dann ist hier eine andere Art und Weise VM CPU-Auslastung zu bekommen. Runtime bean können Sie auch Last geben CPU pro Prozessor. Ich habe dies nur auf Red Hat Linux Beobachter Tomcat Leistung verwendet. Sie haben JMX remote in catalina.sh zu ermöglichen, damit dies funktioniert.

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://my.tomcat.host:8080/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);     
MBeanServerConnection conn = jmxc.getMBeanServerConnection();       
ObjectName name = new ObjectName("oracle.jrockit.management:type=Runtime");
Double jvmCpuLoad =(Double)conn.getAttribute(name, "VMGeneratedCPULoad");

Auf Windows, können Sie den systeminfo Befehl ausführen und rufen seine Ausgabe zum Beispiel mit dem folgenden Code:

private static class WindowsSystemInformation
{
    static String get() throws IOException
    {
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec("systeminfo");
        BufferedReader systemInformationReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

        StringBuilder stringBuilder = new StringBuilder();
        String line;

        while ((line = systemInformationReader.readLine()) != null)
        {
            stringBuilder.append(line);
            stringBuilder.append(System.lineSeparator());
        }

        return stringBuilder.toString().trim();
    }
}

Eine einfache Möglichkeit, die verwendet werden kann, die OS-Ebene Informationen zu erhalten und ich getestet in meinem Mac, die gut funktioniert:

 OperatingSystemMXBean osBean =
        (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
    return osBean.getProcessCpuLoad();

Sie können viele relevante Kennzahlen des Betriebssystems finden Sie hier

Hey Sie können dies tun, mit java / com Integration. Durch den Zugriff auf WMI bietet Ihnen alle Informationen erhalten können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top