получать системную информацию на уровне ОС

голоса
213

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

Кто-нибудь был в состоянии успешно извлекать информацию, такую ​​как текущее дисковое пространство используется, загрузки процессора и памяти, используемой в базовой ОС? А как насчет всего, что приложение Java сама потребляет?

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

Задан 25/08/2008 в 02:49
источник пользователем
На других языках...                            


14 ответов

голоса
190

Вы можете получить некоторую ограниченную информацию о памяти из класса времени выполнения. Это на самом деле это не совсем то, что вы ищете, но я думал, что обеспечу его для полноты картины. Вот небольшой пример. Изменить: Вы также можете получить информацию об использовании диска из класса 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());
    }
  }
}
Ответил 25/08/2008 d 03:53
источник пользователем

голоса
90

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

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

Например ... вызовите метод получения 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();
        }
    }
}
Ответил 15/09/2008 d 00:41
источник пользователем

голоса
40

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

SIGAR == Системная информация, Сбор и инструмент отчетности.

Ответил 25/08/2008 d 03:36
источник пользователем

голоса
18

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

Ответил 23/06/2010 d 02:17
источник пользователем

голоса
9

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

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

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

Ответил 16/08/2012 d 15:31
источник пользователем

голоса
6

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

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

Вот ссылка с подробной информацией.

Ответил 30/06/2016 d 15:05
источник пользователем

голоса
5

Добавить 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));
}
Ответил 10/04/2016 d 18:01
источник пользователем

голоса
5

Посмотрите на API , доступных в java.lang.management пакете. Например:

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

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

Ответил 26/08/2008 d 08:09
источник пользователем

голоса
4

Это все еще в стадии разработки , но вы уже можете использовать 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());
//[...]
Ответил 02/03/2016 d 21:24
источник пользователем

голоса
4

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

например, у меня есть процесс Java с интенсивной сетевой нагрузкой - это единственное, что работает и процессор на 99%, но только 55% от сообщается как «процессора CPU».

даже не поймите меня началась «средняя нагрузка», как это рядом с бесполезным, несмотря на единственный элемент процессора, связанные с боб MX. если только солнце в их время от времени мудрости воздействию что-то вроде «getTotalCpuTime» ...

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

Ответил 02/06/2009 d 03:01
источник пользователем

голоса
4

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

Ответил 24/03/2009 d 20:43
источник пользователем

голоса
2

На 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();
    }
}
Ответил 27/10/2016 d 09:56
источник пользователем

голоса
2

Если вы используете JRockit VM, то здесь есть другой способ получить использование процессора VM. Продолжительность боб также может дать вам загрузку процессора на процессор. Я использовал это только на Red Hat Linux для наблюдателя производительности Tomcat. Вы должны включить JMX пульт в 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");
Ответил 10/11/2011 d 08:55
источник пользователем

голоса
1

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

Ответил 24/03/2009 d 13:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more