получение информации о системе на уровне ОС
в настоящее время я создаю приложение Java, которое может работать на многих разных платформах, но в первую очередь на вариантах Solaris, Linux и Windows.
кто-нибудь смог успешно извлечь информацию, такую как текущее используемое дисковое пространство, использование процессора и памяти, используемой в базовой ОС? Как насчет того, что само приложение Java потребляет?
предпочтительно я хотел бы получить эту информацию без использования JNI.
14 ответов:
вы можете получить некоторую ограниченную информацию о памяти из класса времени выполнения. Это действительно не совсем то, что вы ищете, но я думал, что предоставлю его для полноты картины. Вот небольшой пример. Изменить: вы также можете получить информацию об использовании диска из класса 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()); } } }
The java.ленг.управление пакет дает вам намного больше информации, чем во время выполнения, например, он даст вам куча памяти (
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()) отдельно от памяти без кучи (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()).вы также можете получить процесс использования процессора (без написания собственного кода 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(); } } }
Я думаю, что лучший способ-это использовать тег SIGAR API by Hyperic. Он работает для большинства основных операционных систем (черт побери, почти все современные ) и очень прост в работе. Разработчики очень отзывчивы на своих форумах и списках рассылки. Мне тоже нравится, что это
GPL2Apache licensed. Они также предоставляют массу примеров на Java!SIGAR = = системная информация, сбор и отчетность инструмент.
есть проект Java, который использует JNA (поэтому нет собственных библиотек для установки) и находится в активной разработке. В настоящее время он поддерживает Linux, OSX, Windows, Solaris и FreeBSD и предоставляет информацию о оперативной памяти, процессоре, батарее и файловой системе.
вы можете получить некоторую информацию системного уровня с помощью
System.getenv(), передавая соответствующее имя переменной среды в качестве параметра. Например, на Windows:System.getenv("PROCESSOR_IDENTIFIER") System.getenv("PROCESSOR_ARCHITECTURE") System.getenv("PROCESSOR_ARCHITEW6432") System.getenv("NUMBER_OF_PROCESSORS")для других операционных систем наличие / отсутствие и имена соответствующих переменных среды будут отличаться.
для 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();здесь ссылке С подробностями.
посмотрите на API, доступные в java.ленг.управление пакета. Например:
OperatingSystemMXBean.getSystemLoadAverage()ThreadMXBean.getCurrentThreadCpuTime()ThreadMXBean.getCurrentThreadUserTime()там есть множество других полезных вещей.
добавить зависимость 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)); }
обычно, чтобы получить информацию об ОС низкого уровня, вы можете вызвать специальные команды ОС, которые дают вам информацию, которую вы хотите во время выполнения.exec () или читать файлы, такие как /proc/* в Linux.
использование процессора не является простым -- java.ленг.управление через COM.солнце.управление.OperatingSystemMXBean.getProcessCpuTime подходит близко (см. Отличный фрагмент кода Патрика выше), но обратите внимание, что он дает доступ только к времени, потраченному процессором в вашем процессе. он не расскажет вам о времени процессора, потраченном в других процессах, или даже времени процессора, потраченного на выполнение системных действий, связанных с вашим процессом.
например, у меня есть сетевой процесс java - это единственное, что работает и процессор находится на 99%, но только 55% из них сообщается как "процессор CPU".
даже не заставляйте меня начинать с "средней нагрузки", так как это почти бесполезно, несмотря на то, что это единственный элемент, связанный с процессором, на MX bean. если бы только солнце в своей случайной мудрости выставило что-то вроде "getTotalCpuTime"...
для серьезного мониторинга процессора сигар, упомянутый Мэттом, кажется лучшим выбором.
Она находится в стадии разработки, но вы уже можете использовать 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()); //[...]
Если вы используете виртуальную машину виртуальная машина JRockit, то вот другой способ использования виртуальных процессора. Runtime bean также может дать вам загрузку процессора на процессор. Я использовал это только на 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");
On
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(); } }
Эй, вы можете сделать это с помощью интеграции java/com. При доступе к функциям WMI вы можете получить всю информацию.
Comments