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.