Сведения о вопросе

NOTtoday

03:10, 8th August, 2020

Теги

java   memory   resources   system    

получить информацию о системе OS-го уровня

Просмотров: 428   Ответов: 15

В настоящее время я создаю приложение Java, которое может работать на многих разных платформах, но в первую очередь на вариантах Solaris, Linux и Windows.

Удалось ли кому-нибудь успешно извлечь такую информацию, как текущее используемое дисковое пространство, использование CPU и память, используемая в базовом OS? А как насчет того, что потребляет само приложение Java?

Предпочтительно я хотел бы получить эту информацию без использования JNI.



  Сведения об ответе

qwerty101

09:47, 15th August, 2020

Вы можете получить некоторую ограниченную информацию о памяти из класса Runtime. Это действительно не совсем то, что вы ищете, но я подумал, что мог бы предоставить его для полноты картины. Вот небольшой пример. Изменить: вы также можете получить информацию об использовании диска из класса java.io.File. Материал для использования дискового пространства требует Java 1.6 или выше.

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


  Сведения об ответе

SEEYOU

01:49, 13th August, 2020

Пакет java.lang.management действительно дает вам намного больше информации, чем среда выполнения - например, он даст вам память кучи ( ManagementFactory.getMemoryMXBean().getHeapMemoryUsage() ) отдельно от памяти без кучи (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage() ).

Вы также можете получить использование процесса CPU (без написания собственного кода JNI), но вам нужно привести java.lang.management.OperatingSystemMXBean к com.sun.management.OperatingSystemMXBean . Это работает на Windows и Linux,я не проверял его нигде.

Например... чтобы получить более точные показания, чаще вызывайте метод get getCpuUsage().

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


  Сведения об ответе

lool

00:01, 23rd August, 2020

Я думаю, что лучший метод-это реализовать SIGAR API с помощью Hyperic . Он работает для большинства основных операционных систем (черт побери, почти все современные) и очень прост в работе. Разработчики очень отзывчивы на своих форумах и списках рассылки. Мне также нравится, что это лицензия GPL2 Apache . Они также предоставляют массу примеров в Java!

SIGAR = = системный инструмент сбора информации и отчетности.


  Сведения об ответе

+-*/

12:56, 5th August, 2020

Есть проект Java, который использует JNA (поэтому нет собственных библиотек для установки) и находится в активной разработке. В настоящее время он поддерживает Linux, OSX, Windows, Solaris и FreeBSD и предоставляет информацию о RAM, CPU, батарее и файловой системе.


  Сведения об ответе

#hash

21:06, 1st October, 2020

Вы можете получить некоторую информацию системного уровня, используя System.getenv(), передавая соответствующее имя переменной среды в качестве параметра. Например, на Windows:

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

Для других операционных систем наличие / отсутствие и имена соответствующих переменных окружения будут отличаться.


  Сведения об ответе

appple

09:40, 14th August, 2020

Для windows я пошел этим путем.

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

Вот ссылка с подробностями.


  Сведения об ответе

PROGA

16:15, 15th August, 2020

Взгляните на APIs, доступный в пакете java.lang.management. Например:

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

Там же есть масса других полезных вещей.


  Сведения об ответе

lool

02:37, 15th August, 2020

Добавить зависимость OSHI через maven:

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

Получите оставшуюся емкость батареи в процентах:

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


  Сведения об ответе

PROGA

21:06, 1st October, 2020

Обычно, чтобы получить информацию низкого уровня OS, вы можете вызвать OS конкретных команд, которые дают вам информацию, которую вы хотите с Runtime.exec() или читать файлы, такие как /proc/* в Linux.


  Сведения об ответе

lesha

05:40, 4th August, 2020

Использование CPU не является простым -- java.lang.management через com.sun.management.OperatingSystemMXBean.getProcessCpuTime подходит близко (см. Отличный фрагмент кода Патрика выше), но обратите внимание, что это только дает доступ к времени, которое CPU потратил в вашем процессе. он не расскажет вам о CPU времени, потраченном на другие процессы, или даже о CPU времени, потраченном на выполнение системных действий, связанных с вашим процессом.

например, у меня есть сетеемкий процесс java - это единственное, что работает, и CPU находится в 99%, но только 55% из них сообщается как "processor CPU".

даже не заставляйте меня начинать с "load average", поскольку это почти бесполезно, несмотря на то, что это единственный предмет, связанный с cpu в бобе MX. если бы только солнце в своей случайной мудрости выставляло что-то вроде "getTotalCpuTime"...

для серьезного мониторинга CPU SIGAR, упомянутого Мэттом, кажется лучшим вариантом.


  Сведения об ответе

$DOLLAR

04:21, 16th August, 2020

Он все еще находится в стадии разработки, но вы уже можете использовать jHardware

Это простая библиотека, которая обрывает системные данные, используя Java. Он работает как в Linux, так и в 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());
//[...]


  Сведения об ответе

screen

02:11, 6th August, 2020

В случае использования JRockit VM то вот другой способ получения виртуальных машин использование CPU. Runtime bean также может дать вам нагрузку CPU на процессор. Я использовал это только на Red Hat Linux для наблюдения за работой Tomcat. Вы должны включить JMX remote в catalina.sh, чтобы это работало.

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


  Сведения об ответе

park

08:39, 1st August, 2020

На Windows можно выполнить команду systeminfo и получить ее выходные данные, например, со следующим кодом:

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


  Сведения об ответе

Chhiki

14:15, 8th August, 2020

Один простой способ, который может быть использован для получения информации об уровне OS, и я протестировал на своем Mac, который хорошо работает :

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

Здесь вы можете найти множество релевантных метрик операционной системы


  Сведения об ответе

nYU

21:32, 17th August, 2020

Эй, вы можете сделать это с помощью интеграции java/com. Получив доступ к функциям WMI, вы можете получить всю необходимую информацию.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться