Gostaria de monitorar as seguintes informações do sistema em Java:
- Uso atual da CPU ** (porcentagem)
- Memória disponível * (livre / total)
Espaço em disco disponível (livre / total)
* Observe que quero dizer memória geral disponível para todo o sistema, não apenas a JVM.
Estou procurando uma solução de plataforma cruzada (Linux, Mac e Windows) que não dependa do meu próprio código chamando programas externos ou usando JNI. Embora essas sejam opções viáveis, eu preferiria não manter o código específico do SO, se alguém já tiver uma solução melhor.
Se houver uma biblioteca gratuita por aí que faça isso de maneira confiável e multiplataforma, isso seria ótimo (mesmo que faça chamadas externas ou use o próprio código nativo).
Todas as sugestões são muito apreciadas.
Para esclarecer, gostaria de obter o uso atual da CPU para todo o sistema, não apenas os processos Java.
A API do SIGAR fornece todas as funcionalidades que estou procurando em um pacote, por isso é a melhor resposta para minha pergunta até agora. No entanto, por ser licenciado sob a GPL, não posso usá-lo para meu propósito original (um produto comercial de fonte fechada). É possível que a Hyperic possa licenciar o SIGAR para uso comercial, mas ainda não o examinei. Para meus projetos GPL, definitivamente considerarei o SIGAR no futuro.
Para minhas necessidades atuais, estou inclinado para o seguinte:
- Para uso da CPU,
OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors()
(média de carga por CPU) - Para memória
OperatingSystemMXBean.getTotalPhysicalMemorySize()
eOperatingSystemMXBean.getFreePhysicalMemorySize()
- Para espaço em disco
File.getTotalSpace()
eFile.getUsableSpace()
Limitações:
Os getSystemLoadAverage()
métodos de consulta de espaço em disco e estão disponíveis apenas no Java 6. Além disso, algumas funcionalidades do JMX podem não estar disponíveis para todas as plataformas (ou seja, foi relatado que getSystemLoadAverage()
retorna -1 no Windows).
Embora originalmente licenciado sob a GPL, foi alterado para Apache 2.0 , que geralmente pode ser usado para produtos comerciais de código fechado.
Respostas:
Na linha do que mencionei neste post . Eu recomendo que você use a API SIGAR . Eu uso a API SIGAR em um dos meus próprios aplicativos e é ótimo. Você descobrirá que é estável, bem suportado e cheio de exemplos úteis. É de código aberto com uma
licença GPL 2Apache 2.0. Confira. Tenho a sensação de que atenderá às suas necessidades.Usando Java e a API Sigar, você pode obter informações, métricas, memória, CPU, disco, média de carga, interface de rede, informações da tabela de processos, informações de rotas, etc.
fonte
O seguinte supostamente fornece CPU e RAM. Veja ManagementFactory para mais detalhes.
fonte
No JDK 1.7, é possível obter o uso da CPU e da memória do sistema via
com.sun.management.OperatingSystemMXBean
. Isso é diferente dejava.lang.management.OperatingSystemMXBean
.fonte
Isso funciona perfeitamente para mim sem nenhuma API externa, apenas o recurso oculto do Java nativo :)
fonte
Consulte este artigo muito detalhado: http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclasstogetJVMCPUtime
Para obter a porcentagem de CPU usada, tudo que você precisa é de algumas contas simples:
Nota: Você deve importar
com.sun.management.OperatingSystemMXBean
e nãojava.lang.management.OperatingSystemMXBean
.fonte
Para espaço em disco, se você tem o Java 6, você pode usar os getTotalSpace e GetFreeSpace métodos em Arquivo. Se você não está no Java 6, acredito que você pode usar o Apache Commons IO para chegar até lá.
Não sei de nenhuma maneira de plataforma cruzada para obter o uso da CPU ou o uso da memória.
fonte
Muito disso já está disponível via JMX. Com o Java 5, o JMX é incorporado e eles incluem um visualizador de console JMX com o JDK.
Você pode usar o JMX para monitorar manualmente ou chamar comandos JMX a partir de Java se precisar dessas informações em seu próprio tempo de execução.
fonte
A resposta aceita em 2008 recomendou o SIGAR. No entanto, como um comentário de 2014 (@Alvaro) diz:
Minha recomendação é usar https://github.com/oshi/oshi
Ou a resposta mencionada acima .
fonte
fonte
O código a seguir é apenas Linux (talvez Unix), mas funciona em um projeto real.
fonte
Crie um arquivo em lotes "Pc.bat" como, digiteperf -sc 1 "\ mukit \ processor (_Total) \ %% Tempo do processador"
Você pode usar a classe MProcess,
}
Depois de alguma manipulação de string, você obtém o uso da CPU. Você pode usar o mesmo processo para outras tarefas.
--Mukit Hasan
fonte
typeperf "\processor(_total)\% processor time"
Se você o colocar em arquivo em lotes, use %% em vez de%. Eu usei technet.microsoft.com/en-us/library/bb490960.aspx .