Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
получить информацию о системе OS-го уровня
В настоящее время я создаю приложение Java, которое может работать на многих разных платформах, но в первую очередь на вариантах Solaris, Linux и Windows.
Удалось ли кому-нибудь успешно извлечь такую информацию, как текущее используемое дисковое пространство, использование CPU и память, используемая в базовом OS? А как насчет того, что потребляет само приложение Java?
Предпочтительно я хотел бы получить эту информацию без использования JNI.
Вы можете получить некоторую ограниченную информацию о памяти из класса 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());
}
}
}
Пакет 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();
}
}
}
Я думаю, что лучший метод-это реализовать SIGAR API с помощью Hyperic . Он работает для большинства основных операционных систем (черт побери, почти все современные) и очень прост в работе. Разработчики очень отзывчивы на своих форумах и списках рассылки. Мне также нравится, что это лицензия GPL2 Apache . Они также предоставляют массу примеров в Java!
SIGAR = = системный инструмент сбора информации и отчетности.
Вы можете получить некоторую информацию системного уровня, используя 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();
Вот ссылка с подробностями.
Добавить зависимость 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));
}
Использование 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, упомянутого Мэттом, кажется лучшим вариантом.
Он все еще находится в стадии разработки, но вы уже можете использовать 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 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");
На 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();
}
}
Один простой способ, который может быть использован для получения информации об уровне OS, и я протестировал на своем Mac, который хорошо работает :
OperatingSystemMXBean osBean =
(OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
return osBean.getProcessCpuLoad();
Здесь вы можете найти множество релевантных метрик операционной системы