Me gustaría monitorear la siguiente información del sistema en Java:
- Uso actual de la CPU ** (porcentaje)
- Memoria disponible * (libre / total)
Espacio disponible en disco (libre / total)
* Tenga en cuenta que me refiero a la memoria general disponible para todo el sistema, no solo la JVM.
Estoy buscando una solución multiplataforma (Linux, Mac y Windows) que no se base en mi propio código para llamar a programas externos o usar JNI. Aunque estas son opciones viables, preferiría no mantener yo mismo el código específico del sistema operativo si alguien ya tiene una mejor solución.
Si hay una biblioteca gratuita por ahí que lo haga de manera confiable y multiplataforma, sería genial (incluso si realiza llamadas externas o utiliza el código nativo).
Cualquier sugerencia es muy apreciada.
Para aclarar, me gustaría obtener el uso actual de la CPU para todo el sistema, no solo los procesos de Java.
La API SIGAR proporciona toda la funcionalidad que busco en un paquete, por lo que es la mejor respuesta a mi pregunta hasta ahora. Sin embargo, debido a que tiene licencia bajo la GPL, no puedo usarlo para mi propósito original (una fuente cerrada, producto comercial). Es posible que Hyperic pueda licenciar SIGAR para uso comercial, pero no lo he investigado. Para mis proyectos GPL, definitivamente consideraré SIGAR en el futuro.
Para mis necesidades actuales, me inclino por lo siguiente:
- Para uso de CPU,
OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors()
(promedio de carga por CPU) - Por memoria,
OperatingSystemMXBean.getTotalPhysicalMemorySize()
yOperatingSystemMXBean.getFreePhysicalMemorySize()
- Para espacio en disco,
File.getTotalSpace()
yFile.getUsableSpace()
Limitaciones:
Los getSystemLoadAverage()
métodos de consulta y espacio en disco solo están disponibles en Java 6. Además, algunas funciones de JMX pueden no estar disponibles para todas las plataformas (es decir, se ha informado quegetSystemLoadAverage()
devuelve -1 en Windows).
Aunque originalmente tenía licencia bajo GPL, se ha cambiado a Apache 2.0 , que generalmente se puede usar para productos comerciales de código cerrado.
Respuestas:
En la línea de lo que mencioné en esta publicación . Te recomiendo que uses la API SIGAR . Uso la API SIGAR en una de mis propias aplicaciones y es genial. Encontrará que es estable, bien soportado y lleno de ejemplos útiles. Es de código abierto con una
licencia GPL 2Apache 2.0. Echale un vistazo. Tengo la sensación de que satisfará tus necesidades.Con Java y la API de Sigar, puede obtener memoria, CPU, disco, promedio de carga, información y métricas de la interfaz de red, información de la tabla de procesos, información de ruta, etc.
fuente
Lo siguiente supuestamente te da CPU y RAM. Ver ManagementFactory para más detalles.
fuente
En JDK 1.7, puede obtener el uso de CPU y memoria del sistema a través de
com.sun.management.OperatingSystemMXBean
. Esto es diferente ajava.lang.management.OperatingSystemMXBean
.fuente
Esto funciona para mí perfectamente sin ninguna API externa, solo la función oculta de Java nativa :)
fuente
Echa un vistazo a este artículo muy detallado: http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclasstogetJVMCPUtime
Para obtener el porcentaje de CPU utilizado, todo lo que necesita son algunas matemáticas simples:
Nota: debe importar
com.sun.management.OperatingSystemMXBean
y nojava.lang.management.OperatingSystemMXBean
.fuente
Para espacio en disco, si tiene Java 6, puede usar los métodos getTotalSpace y getFreeSpace en File. Si no está en Java 6, creo que puede usar Apache Commons IO para llegar hasta allí.
No conozco ninguna forma multiplataforma para obtener el uso de CPU o el uso de memoria, me temo.
fuente
Mucho de esto ya está disponible a través de JMX. Con Java 5, JMX está integrado e incluye un visor de consola JMX con el JDK.
Puede usar JMX para monitorear manualmente o invocar comandos JMX desde Java si necesita esta información en su propio tiempo de ejecución.
fuente
La respuesta aceptada en 2008 recomendó SIGAR. Sin embargo, como dice un comentario de 2014 (@Alvaro):
Mi recomendación es usar https://github.com/oshi/oshi
O la respuesta mencionada anteriormente .
fuente
fuente
El siguiente código es Linux (quizás Unix) solamente, pero funciona en un proyecto real.
fuente
Cree un archivo por lotes "Pc.bat" como, typeperf -sc 1 "\ mukit \ processor (_Total) \ %% Processor Time"
Puedes usar la clase MProcess,
}
Luego, después de manipular algunas cadenas, obtienes el uso de la CPU. Puede usar el mismo proceso para otras tareas.
--Mukit Hasan
fuente
typeperf "\processor(_total)\% processor time"
si lo coloca en un archivo por lotes, use %% en lugar de%. Solía technet.microsoft.com/en-us/library/bb490960.aspx .