uzyskaj informacje o systemie na poziomie systemu operacyjnego

Obecnie buduję aplikację Java, która może być uruchamiana na wielu różnych platformach, ale przede wszystkim na Solarisie, Linuksie i Windows.

Czy ktoś był w stanie skutecznie wyodrębnić informacje, takie jak obecne miejsce na dysku, wykorzystanie PROCESORA i pamięci używanej w podstawowym systemie operacyjnym? A co z tym, co sama aplikacja Java zużywa?

Wolałbym uzyskać te informacje bez korzystania z JNI.

Author: Hrqls, 2008-08-25

14 answers

Możesz uzyskać pewne informacje o ograniczonej pamięci z klasy Runtime. To naprawdę nie jest dokładnie to, czego szukasz, ale pomyślałem, że dostarczę go ze względu na kompletność. Oto mały przykład. Edit: możesz również uzyskać informacje o użyciu Dysku z klasy java. io. File. Wykorzystanie miejsca na dysku wymaga Javy w wersji 1.6 lub wyższej.

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());
    }
  }
}
 192
Author: William Brendel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 19:34:10

Java.lang.pakiet management daje Ci o wiele więcej informacji niż Runtime - na przykład da ci pamięć sterty (ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()) oddzieloną od pamięci innej niż sterta (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()).

Możesz również uzyskać użycie procesora procesowego (bez pisania własnego kodu JNI), ale musisz rzucić java.lang.management.OperatingSystemMXBean na com.sun.management.OperatingSystemMXBean. To działa na Windows i Linux, nie testowałem go gdzie indziej.

Na przykład ... aby uzyskać dokładniejsze wyniki, należy częściej wywoływać metodę get getCpuUsage() odczyty.

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();
        }
    }
}
 92
Author: Patrick Wilkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-17 02:59:50

Myślę, że najlepszą metodą jest zaimplementowanie SIGAR API przez Hyperic. Działa na większość głównych systemów operacyjnych (prawie wszystko nowoczesne) i jest bardzo łatwy w obsłudze. Programiści są bardzo responsywni na swoich forum i listach mailingowych. Podoba mi się również to, że jest to GPL2 Apache licensed . Dostarczają one mnóstwo przykładów również w Javie!

SIGAR = = narzędzie do gromadzenia i raportowania informacji o systemie.

 40
Author: Matt Cummings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-27 19:24:20

Jest projekt Java, który używa JNA (więc nie ma natywnych bibliotek do zainstalowania) i jest w aktywnym rozwoju. Obecnie obsługuje systemy Linux, OSX, Windows, Solaris i FreeBSD oraz dostarcza informacje o pamięci RAM, procesorze, baterii i systemie plików.

 20
Author: dB.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 15:56:47

Możesz uzyskać informacje na poziomie systemu używając System.getenv(), podając jako parametr odpowiednią nazwę zmiennej środowiskowej. Na przykład w systemie Windows:

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

Dla innych systemów operacyjnych obecność / brak oraz nazwy odpowiednich zmiennych środowiskowych będą się różnić.

 10
Author: Alexandr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-16 15:39:38

Dla windows poszedłem w tę stronę.

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

Oto link ze szczegółami.

 7
Author: Yan Khonski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-13 11:50:11

Spójrz na API dostępne w java.lang.zarządzanie Pakiet. Na przykład:

  • OperatingSystemMXBean.getSystemLoadAverage()
  • ThreadMXBean.getCurrentThreadCpuTime()
  • ThreadMXBean.getCurrentThreadUserTime()
Jest tam mnóstwo innych przydatnych rzeczy.
 6
Author: staffan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-26 07:09:20

Dodaj zależność OSHI poprzez maven:

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

Uzyskaj pojemność baterii w procentach:

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));
}
 6
Author: Oleksii Kyslytsyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-10 18:01:01

Zazwyczaj, aby uzyskać informacje o systemie operacyjnym niskiego poziomu, można wywołać polecenia specyficzne dla systemu operacyjnego, które dają informacje, które chcesz z uruchomieniem.exec() lub odczytać pliki takie jak/ proc / * w Linuksie.

 5
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-24 19:43:26

Użycie procesora nie jest proste -- java.lang.zarządzanie przez kom.słońce.zarządzanie.OperatingSystemMXBean.getProcessCpuTime jest blisko (zobacz doskonały fragment kodu Patricka powyżej), ale należy pamiętać, że daje dostęp tylko do czasu CPU spędzonego w procesie. nie powie Ci o czasie procesora spędzonym w innych procesach, ani nawet o czasie procesora spędzonym na wykonywaniu czynności systemowych związanych z Twoim procesem.

Dla przykładu mam proces java intensywny w sieci -- tylko to działa i procesor jest w 99%, ale tylko 55% Z tego jest zgłaszane jako "procesor CPU".

Nawet nie każ mi zaczynać od "load average", ponieważ jest prawie bezużyteczny, mimo że jest jedynym elementem związanym z procesorem na MX bean. gdyby tylko słońce w ich okazjonalnej mądrości odsłoniło coś w rodzaju "getTotalCpuTime"...

Do poważnego monitorowania procesora SIGAR wspomniany przez Matta wydaje się najlepszym rozwiązaniem.

 5
Author: Partly Cloudy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-02 02:01:18

Jest jeszcze w fazie rozwoju, ale można już używać jHardware

Jest to prosta biblioteka, która scrapuje dane systemowe za pomocą Javy. Działa zarówno w systemie Linux, jak i 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());
//[...]
 4
Author: profesor_falken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-03 17:54:36

Jeśli używasz JRockit VM, oto inny sposób na uzyskanie użycia procesora VM. Runtime bean może również dać obciążenie procesora na procesor. Używałem tego tylko na Red Hat Linux do obserwowania wydajności Tomcat. Musisz włączyć JMX remote w catalina.sh żeby to zadziałało.

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");
 2
Author: petro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-10 07:55:07

Na Windows, możesz uruchomić systeminfo polecenie i pobrać jego wyjście na przykład za pomocą następującego kodu:

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();
    }
}
 2
Author: BullyWiiPlaza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 09:56:54

Hej możesz to zrobić z integracją java / com. Poprzez dostęp do funkcji WMI możesz uzyskać wszystkie informacje.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-24 12:32:46