Atualmente, estou criando um aplicativo Java que pode acabar sendo executado em muitas plataformas diferentes, mas principalmente em variantes do Solaris, Linux e Windows.
Alguém conseguiu extrair com sucesso informações como o espaço em disco atual usado, a utilização da CPU e a memória usada no sistema operacional subjacente? E o que o próprio aplicativo Java está consumindo?
De preferência, eu gostaria de obter essas informações sem usar o JNI.
Runtime.getRuntime().freeMemory()
como sugerido na resposta aceita NÃO dado a quantidade de memória livre.Respostas:
Você pode obter algumas informações de memória limitadas da classe Runtime. Realmente não é exatamente o que você está procurando, mas pensei em fornecer isso por uma questão de integridade. Aqui está um pequeno exemplo. Editar: Você também pode obter informações de uso do disco da classe java.io.File. O material de uso do espaço em disco requer Java 1.6 ou superior.
fonte
O pacote java.lang.management fornece muito mais informações que o Runtime - por exemplo, ele fornece memória heap (
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
) separada da memória não heap (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
).Você também pode obter o uso da CPU do processo (sem escrever seu próprio código JNI), mas você precisa para lançar o
java.lang.management.OperatingSystemMXBean
a umcom.sun.management.OperatingSystemMXBean
. Isso funciona no Windows e Linux, eu não testei em nenhum outro lugar.Por exemplo ... chame o método get getCpuUsage () com mais frequência para obter leituras mais precisas.
fonte
OperatingSystemMXBean
paracom.sun.management.OperatingSystemMXBean
e prefácio todas as instânciasgetOperatingSystemMXBean()
comManagementFactory.
. Você precisa importar todas as classes adequadamente.getCpuUsage
significativo que o sistema é usando todas as suas availableProcessors a 100%?((double)( processCpuTime - lastProcessCpuTime )) / ((double)( systemTime - lastSystemTime ))
Eu acho que o melhor método disponível para implementar a API SIGAR da Hyperic . Ele funciona para a maioria dos principais sistemas operacionais (muito perto de qualquer coisa moderna) e é muito fácil de trabalhar. Os desenvolvedores são muito responsivos em seus fóruns e listas de discussão. Também gosto que seja licenciado pela
GPL2Apache . Eles fornecem uma tonelada de exemplos em Java também!SIGAR == Sistema de informações, coleta e relatórios ferramenta.
fonte
Há um projeto Java que usa 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 sobre RAM, CPU, bateria e sistema de arquivos.
fonte
Para janelas eu fui por aqui.
Aqui está o link com detalhes.
fonte
Você pode obter algumas informações no nível do sistema usando
System.getenv()
, passando o nome da variável de ambiente relevante como parâmetro. Por exemplo, no Windows:Para outros sistemas operacionais, a presença / ausência e os nomes das variáveis de ambiente relevantes serão diferentes.
fonte
Adicione dependência OSHI via maven:
Obtenha uma capacidade da bateria restante em porcentagem:
fonte
Veja as APIs disponíveis no pacote java.lang.management . Por exemplo:
OperatingSystemMXBean.getSystemLoadAverage()
ThreadMXBean.getCurrentThreadCpuTime()
ThreadMXBean.getCurrentThreadUserTime()
Existem muitas outras coisas úteis lá também.
fonte
Geralmente, para obter informações de baixo nível do sistema operacional, você pode chamar comandos específicos do sistema operacional que fornecem as informações desejadas com o Runtime.exec () ou ler arquivos como / proc / * no Linux.
fonte
O uso da CPU não é simples - java.lang.management via com.sun.management.OperatingSystemMXBean.getProcessCpuTime chega perto (consulte o excelente trecho de código de Patrick acima), mas observe que ele só dá acesso ao tempo que a CPU gastou em seu processo. ele não informa sobre o tempo de CPU gasto em outros processos ou mesmo o tempo de CPU executando atividades do sistema relacionadas ao seu processo.
por exemplo, eu tenho um processo java intensivo em rede - é a única coisa em execução e a CPU está em 99%, mas apenas 55% disso é relatado como "CPU do processador".
nem me inicie na "carga média", pois é quase inútil, apesar de ser o único item relacionado à CPU no bean MX. se apenas o sol em sua sabedoria ocasional expusesse algo como "getTotalCpuTime" ...
para monitoramento sério da CPU, o SIGAR mencionado por Matt parece ser a melhor aposta.
fonte
Em
Windows
, você pode executar osysteminfo
comando e recuperar sua saída, por exemplo, com o seguinte código:fonte
Se você estiver usando o Jrockit VM, eis uma outra maneira de obter o uso da CPU da VM. O bean de tempo de execução também pode fornecer a carga da CPU por processador. Eu usei isso apenas no Red Hat Linux para observar o desempenho do Tomcat. Você precisa habilitar o JMX remote em catalina.sh para que isso funcione.
fonte
Ainda está em desenvolvimento, mas você já pode usar o jHardware
É uma biblioteca simples que captura dados do sistema usando Java. Funciona em Linux e Windows.
fonte
Uma maneira simples que pode ser usada para obter as informações no nível do SO e eu testei no meu Mac, que funciona bem:
Você pode encontrar muitas métricas relevantes do sistema operacional aqui
fonte
Ei, você pode fazer isso com a integração java / com. Ao acessar os recursos WMI, você pode obter todas as informações.
fonte
Para obter a média de carregamento do sistema de 1 minuto, 5 minutos e 15 minutos dentro do código java, você pode fazer isso executando o comando
cat /proc/loadavg
usando e interpretando-o como abaixo:E para obter a memória do sistema físico executando o comando
free -m
e interpretando-o como abaixo:fonte