Actualmente estoy construyendo una aplicación Java que podría terminar ejecutándose en muchas plataformas diferentes, pero principalmente variantes de Solaris, Linux y Windows.
¿Alguien ha podido extraer con éxito información como el espacio de disco actual utilizado, la utilización de la CPU y la memoria utilizada en el sistema operativo subyacente? ¿Qué pasa con lo que está consumiendo la aplicación Java?
Preferiblemente me gustaría obtener esta información sin usar JNI.
Runtime.getRuntime().freeMemory()
como se sugiere en la respuesta aceptada NO le proporciona la cantidad de memoria libre.Respuestas:
Puede obtener información de memoria limitada de la clase Runtime. Realmente no es exactamente lo que está buscando, pero pensé que se lo proporcionaría por completo. Aquí hay un pequeño ejemplo. Editar: También puede obtener información sobre el uso del disco de la clase java.io.File. El uso del espacio en disco requiere Java 1.6 o superior.
fuente
El paquete java.lang.management le brinda mucha más información que Runtime; por ejemplo, le proporcionará memoria heap (
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
) separada de la memoria no heap (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
).También puede obtener el uso de CPU de proceso (sin escribir su propio código JNI), pero debe convertirlo
java.lang.management.OperatingSystemMXBean
en uncom.sun.management.OperatingSystemMXBean
. Esto funciona en Windows y Linux, no lo he probado en otros lugares.Por ejemplo ... llame al método get getCpuUsage () con más frecuencia para obtener lecturas más precisas.
fuente
OperatingSystemMXBean
decom.sun.management.OperatingSystemMXBean
y prefacio de todas las instancias degetOperatingSystemMXBean()
conManagementFactory.
. Necesita importar todas las clases de manera adecuada.getCpuUsage
que el sistema está utilizando todos sus Procesadores disponibles al 100%?((double)( processCpuTime - lastProcessCpuTime )) / ((double)( systemTime - lastSystemTime ))
Creo que el mejor método es implementar la API SIGAR de Hyperic . Funciona para la mayoría de los principales sistemas operativos (casi cualquier cosa moderna) y es muy fácil trabajar con él. Los desarrolladores son muy receptivos en sus foros y listas de correo. También me gusta que tenga licencia
GPL2Apache . ¡También proporcionan un montón de ejemplos en Java!SIGAR == Información del sistema, herramienta de recopilación e informes.
fuente
Hay un proyecto de Java que usa JNA (por lo que no hay que instalar bibliotecas nativas) y está en desarrollo activo. Actualmente es compatible con Linux, OSX, Windows, Solaris y FreeBSD y proporciona información de RAM, CPU, batería y sistema de archivos.
fuente
Para windows fui por aquí.
Aquí está el enlace con detalles.
fuente
Puede obtener información a nivel del sistema utilizando
System.getenv()
, pasando el nombre de la variable de entorno relevante como parámetro. Por ejemplo, en Windows:Para otros sistemas operativos, la presencia / ausencia y los nombres de las variables de entorno relevantes serán diferentes.
fuente
Agregue dependencia OSHI a través de maven:
Obtenga una capacidad de batería restante en porcentaje:
fuente
Eche un vistazo a las API disponibles en el paquete java.lang.management . Por ejemplo:
OperatingSystemMXBean.getSystemLoadAverage()
ThreadMXBean.getCurrentThreadCpuTime()
ThreadMXBean.getCurrentThreadUserTime()
Hay muchas otras cosas útiles allí también.
fuente
Por lo general, para obtener información del sistema operativo de bajo nivel, puede llamar a comandos específicos del sistema operativo que le brindan la información que desea con Runtime.exec () o leer archivos como / proc / * en Linux.
fuente
El uso de la CPU no es sencillo: java.lang.management a través de com.sun.management.OperatingSystemMXBean.getProcessCpuTime se acerca (consulte el excelente fragmento de código de Patrick arriba) pero tenga en cuenta que solo da acceso al tiempo que la CPU pasó en su proceso. no le informará sobre el tiempo de CPU empleado en otros procesos, o incluso el tiempo de CPU dedicado a realizar actividades del sistema relacionadas con su proceso.
Por ejemplo, tengo un proceso Java intensivo en red: es lo único que se ejecuta y la CPU está al 99%, pero solo el 55% de eso se informa como "CPU del procesador".
ni siquiera me hagas comenzar con el "promedio de carga", ya que es casi inútil, a pesar de ser el único elemento relacionado con la CPU en el bean MX. si solo el sol en su sabiduría ocasional expusiera algo como "getTotalCpuTime" ...
para un monitoreo serio de la CPU, SIGAR mencionado por Matt parece ser la mejor apuesta.
fuente
Encendido
Windows
, puede ejecutar elsysteminfo
comando y recuperar su salida, por ejemplo, con el siguiente código:fuente
Si está utilizando Jrockit VM, aquí hay otra forma de obtener el uso de CPU de VM. El bean de tiempo de ejecución también puede proporcionarle una carga de CPU por procesador. He usado esto solo en Red Hat Linux para observar el rendimiento de Tomcat. Debe habilitar el control remoto JMX en catalina.sh para que esto funcione.
fuente
Todavía está en desarrollo pero ya puedes usar jHardware
Es una biblioteca simple que elimina los datos del sistema utilizando Java. Funciona tanto en Linux como en Windows.
fuente
Una forma sencilla que se puede utilizar para obtener la información a nivel del sistema operativo y probé en mi Mac que funciona bien:
Puede encontrar muchas métricas relevantes del sistema operativo aquí
fuente
Hola, puedes hacer esto con la integración java / com. Al acceder a las funciones de WMI puede obtener toda la información.
fuente
Para obtener el promedio de carga del sistema de 1 minuto, 5 minutos y 15 minutos dentro del código de Java, puede hacerlo ejecutando el comando
cat /proc/loadavg
usando e interpretándolo de la siguiente manera:Y para obtener la memoria del sistema físico ejecutando el comando
free -m
y luego interpretándolo de la siguiente manera:fuente