baixar - java 8 32 bits




obter informações do sistema no nível do sistema operacional (10)

Adicionar dependência OSHI via maven:

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

Obtenha uma capacidade da bateria restante em porcentagem:

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

Atualmente estou construindo um aplicativo Java que pode acabar sendo executado em muitas plataformas diferentes, mas principalmente variantes do Solaris, Linux e Windows.

Alguém conseguiu extrair informações com êxito, como o espaço em disco atual usado, a utilização da CPU e a memória usada no sistema operacional subjacente? E quanto ao que o aplicativo Java está consumindo?

De preferência, gostaria de obter essa informação sem usar o JNI.


Ainda está em desenvolvimento, mas você já pode usar o jHardware

É uma biblioteca simples que recolhe dados do sistema usando Java. Funciona tanto no Linux quanto no 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());
//[...]

Ei, você pode fazer isso com a integração java / com. Ao acessar os recursos do WMI, você pode obter todas as informações.



Há um projeto Java que usa o JNA (portanto, não há bibliotecas nativas para instalar) e está em desenvolvimento ativo. Atualmente ele suporta Linux, OSX, Windows, Solaris e FreeBSD e fornece informações de RAM, CPU, bateria e sistema de arquivos.


No Windows , você pode executar o comando systeminfo e recuperar sua saída, por exemplo, com o seguinte código:

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

O uso da CPU não é simples - java.lang.management via com.sun.management.OperatingSystemMXBean.getProcessCpuTime chega perto (veja o excelente trecho de código de Patrick acima), mas note que apenas dá acesso ao tempo que a CPU gasta em seu processo. ele não informará sobre o tempo de CPU gasto em outros processos ou mesmo o tempo de CPU gasto com atividades do sistema relacionadas ao seu processo.

por exemplo, eu tenho um processo java intensivo em rede - é a única coisa que roda e a CPU está em 99%, mas apenas 55% disso é reportado como "CPU do processador".

nem me inicie na "média de carregamento", pois é quase inútil, apesar de ser o único item relacionado a CPU no bean MX. se o sol em sua sabedoria ocasional expusesse algo como "getTotalCpuTime" ...

para o monitoramento sério da CPU, o SIGAR mencionado por Matt parece a melhor aposta.


Para as janelas eu fui assim.

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

Aqui está o link com detalhes.


Você pode obter algumas informações de memória limitadas da classe Runtime. Realmente não é exatamente o que você está procurando, mas eu pensei em fornecer isso por uma questão de completude. Aqui está um pequeno exemplo. Edit: Você também pode obter informações de uso de disco da classe java.io.File. O material de uso do espaço em disco requer o Java 1.6 ou superior.

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

Você pode obter algumas informações no nível do sistema usando System.getenv() , passando o nome da variável de ambiente relevante como um parâmetro. Por exemplo, no Windows:

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

Para outros sistemas operacionais, a presença / ausência e os nomes das variáveis ​​de ambiente relevantes serão diferentes.





system