Вопрос-ответ

Get OS-level system information

Получение системной информации на уровне операционной системы

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

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

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

Переведено автоматически
Ответ 1

Вы можете получить некоторую информацию об ограниченной памяти из класса 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());
}
}
}
Ответ 2

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

Вы также можете получить информацию об использовании процессора процессом (без написания собственного кода 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();
}
}
}
Ответ 3

I think the best method out there is to implement the SIGAR API by Hyperic. It works for most of the major operating systems ( darn near anything modern ) and is very easy to work with. The developer(s) are very responsive on their forum and mailing lists. I also like that it is GPL2 Apache licensed. They provide a ton of examples in Java too!

SIGAR == System Information, Gathering And Reporting tool.

Ответ 4

There's a Java project that uses JNA (so no native libraries to install) and is in active development. It currently supports Linux, OSX, Windows, Solaris and FreeBSD and provides RAM, CPU, Battery and file system information.

java