Necesito verificar el uso de CPU y memoria para el servidor en java, ¿alguien sabe cómo se podría hacer?¿Cómo reviso el uso de CPU y memoria en Java?
Respuesta
Si está utilizando Tomcat, consulte Psi Probe, que le permite controlar el consumo de memoria interna y externa, así como una serie de otras áreas.
El objeto Runtime de Java puede informar el uso de memoria de la JVM. Para el consumo de CPU, tendrá que utilizar una utilidad externa, como Top Manager de Unix o Windows Process Manager.
Para uso de la memoria, el siguiente trabajo,
long total = Runtime.getRuntime().totalMemory();
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
Para uso de la CPU, tendrá que utilizar una aplicación externa para medirlo.
JConsole es una manera fácil de controlar una aplicación Java en ejecución o puede usar un Analizador para obtener información más detallada sobre su aplicación. Me gusta usar el NetBeans Profiler para esto.
Si utiliza la solución runtime/totalMemory que se ha publicado en muchas respuestas aquí (he hecho mucho), asegúrese de forzar dos colecciones de basura primero si desea resultados bastante precisos/consistentes.
Para effiency Java generalmente permite que la basura ocupe toda la memoria antes de forzar un GC, e incluso entonces no es generalmente un GC completo, por lo que los resultados de runtime.freeMemory() siempre estarán entre la cantidad "real" de memoria libre y 0.
El primer GC no tiene todo, se lleva la mayor parte.
La mejora es que si solo hace la llamada a freeMemory() obtendrá un número que es absolutamente inútil y varía ampliamente, pero si hace 2 gc, es un indicador muy confiable. También hace que la rutina MUCHO más lenta (segundos, posiblemente).
Si buscando específicamente en la memoria JVM:
Runtime runtime = Runtime.getRuntime();
NumberFormat format = NumberFormat.getInstance();
StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
sb.append("free memory: " + format.format(freeMemory/1024) + "<br/>");
sb.append("allocated memory: " + format.format(allocatedMemory/1024) + "<br/>");
sb.append("max memory: " + format.format(maxMemory/1024) + "<br/>");
sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory))/1024) + "<br/>");
Sin embargo, éstas deben tomarse sólo una estimación ...
Entonces, si estoy ejecutando en Eclipse, ¿esto dependerá de mi configuración de Eclipse? – Coffee
Sí, eso es correcto – Jeremy
Tenga en cuenta que esta no es la memoria utilizada real: esta es la "memoria asignada" que significa el montón que ha asignado java, por lo que si tiene -Xms90g y su aplicación es muy liviana, igual obtener la memoria asignada como algo superior a 90g. Consulte la respuesta al eliminar "desconocido (yahoo)" a continuación (que podría ser diferente a primera vista) – 0fnt
Desde Java JDK 1.5 viene con una nueva herramienta: JConsole wich puede mostrarle el uso de la CPU y la memoria de cualquier JVM 1.5 o posterior. Puede hacer gráficos de estos parámetros, exportar a CSV, mostrar el número de clases cargadas, el número de instancias, deadlocks, hilos, etc. ...
El generador de perfiles YourKit es una excelente solución comercial. Puede encontrar más información en los documentos en CPU profiling y memory profiling.
JMX, los MXbeans (ThreadMXBean, etc.) proporcionados le darán usos de memoria y CPU.
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
operatingSystemMXBean.getSystemCpuLoad();
Si está utilizando la JVM de Sun, y está interesado en el uso de la memoria interna de la aplicación (la cantidad de la memoria asignada su aplicación está utilizando) Prefiero encender las JVM de basura incorporado registro de recopilación. Simplemente agrega -verbose: gc al comando de inicio.
A partir de la documentación de Sun:
El argumento de la línea de comandos -verbose: gc imprime la información en cada colección. Tenga en cuenta que el formato de la salida -verbose: gc está sujeto a para cambiar entre versiones de la plataforma J2SE. Por ejemplo, aquí está salida de una aplicación de servidor grande:
[GC 325407K->83000K(776768K), 0.2300771 secs] [GC 325816K->83372K(776768K), 0.2454258 secs] [Full GC 267628K->83769K(776768K), 1.8479984 secs]
Aquí vemos dos colecciones menores y un gran uno. Los números antes y después de la flecha
325407K->83000K (in the first line)
indican el tamaño combinado de objetos vivos antes y después de la recolección de basura , respectivamente. Después de recopilaciones menores, el recuento incluye objetos que no están necesariamente vivos pero que no pueden recuperarse, ya sea porque están directamente vivos, o porque están dentro o a los que se hace referencia de la generación mantenida. El número en paréntesis
(776768K) (in the first line)
es el espacio total disponible, sin contar el espacio en el generación permanente, que es el montón total menos uno de los espacios sobrevivientes. La colección menor tomó aproximadamente un cuarto de segundo.
0.2300771 secs (in the first line)
Para más información ver: http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
Aquí hay un código simple de calcular el uso actual de memoria en megabytes:
double currentMemory = ((double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024));
para Eclipse, puede utilizar TPTP (Prueba y Performance Tools Platform) para analizar el uso de memoria, etc. more information
package mkd.Utils;
import java.io.File;
import java.text.NumberFormat;
public class systemInfo {
private Runtime runtime = Runtime.getRuntime();
public String Info() {
StringBuilder sb = new StringBuilder();
sb.append(this.OsInfo());
sb.append(this.MemInfo());
sb.append(this.DiskInfo());
return sb.toString();
}
public String OSname() {
return System.getProperty("os.name");
}
public String OSversion() {
return System.getProperty("os.version");
}
public String OsArch() {
return System.getProperty("os.arch");
}
public long totalMem() {
return Runtime.getRuntime().totalMemory();
}
public long usedMem() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
public String MemInfo() {
NumberFormat format = NumberFormat.getInstance();
StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
sb.append("Free memory: ");
sb.append(format.format(freeMemory/1024));
sb.append("<br/>");
sb.append("Allocated memory: ");
sb.append(format.format(allocatedMemory/1024));
sb.append("<br/>");
sb.append("Max memory: ");
sb.append(format.format(maxMemory/1024));
sb.append("<br/>");
sb.append("Total free memory: ");
sb.append(format.format((freeMemory + (maxMemory - allocatedMemory))/1024));
sb.append("<br/>");
return sb.toString();
}
public String OsInfo() {
StringBuilder sb = new StringBuilder();
sb.append("OS: ");
sb.append(this.OSname());
sb.append("<br/>");
sb.append("Version: ");
sb.append(this.OSversion());
sb.append("<br/>");
sb.append(": ");
sb.append(this.OsArch());
sb.append("<br/>");
sb.append("Available processors (cores): ");
sb.append(runtime.availableProcessors());
sb.append("<br/>");
return sb.toString();
}
public String DiskInfo() {
/* Get a list of all filesystem roots on this system */
File[] roots = File.listRoots();
StringBuilder sb = new StringBuilder();
/* For each filesystem root, print some info */
for (File root : roots) {
sb.append("File system root: ");
sb.append(root.getAbsolutePath());
sb.append("<br/>");
sb.append("Total space (bytes): ");
sb.append(root.getTotalSpace());
sb.append("<br/>");
sb.append("Free space (bytes): ");
sb.append(root.getFreeSpace());
sb.append("<br/>");
sb.append("Usable space (bytes): ");
sb.append(root.getUsableSpace());
sb.append("<br/>");
}
return sb.toString();
}
}
De here
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
int availableProcessors = operatingSystemMXBean.getAvailableProcessors();
long prevUpTime = runtimeMXBean.getUptime();
long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
double cpuUsage;
try
{
Thread.sleep(500);
}
catch (Exception ignored) { }
operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
long upTime = runtimeMXBean.getUptime();
long processCpuTime = operatingSystemMXBean.getProcessCpuTime();
long elapsedCpu = processCpuTime - prevProcessCpuTime;
long elapsedTime = upTime - prevUpTime;
cpuUsage = Math.min(99F, elapsedCpu/(elapsedTime * 10000F * availableProcessors));
System.out.println("Java CPU: " + cpuUsage);
¿Y sobre la memoria? –
Lista
Gracias por la única respuesta que muestra la recuperación de uso de CPU. – Matthieu
También me gustaría añadir la siguiente manera de seguir carga de la CPU:
import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;
double getCpuLoad() {
OperatingSystemMXBean osBean =
(com.sun.management.OperatingSystemMXBean) ManagementFactory.
getPlatformMXBeans(OperatingSystemMXBean.class);
return osBean.getProcessCpuLoad();
}
Usted puede leer más here
- 1. Limitar el uso de memoria y CPU de aplicación Java
- 2. ¿Cómo controlo la CPU, la memoria y el uso del disco de la computadora en Java?
- 3. Android - uso de memoria/CPU
- 4. Java - ¿Cómo puedo monitorear el uso de memoria y CPU de otro proceso?
- 5. ¿Cómo puedo usar de manera programada memoria, hilo y uso de CPU desde mi aplicación Java?
- 6. Captura de CPU y uso de memoria de forma dinámica
- 7. Javascript- Monitorear dinámicamente el uso de CPU/memoria
- 8. ¿Disminuye el uso de CPU/memoria de un subproceso en Java?
- 9. ¿Limitaciones prácticas de la memoria JVM y el uso de la CPU?
- 10. ¿Cómo ver/informar sobre el uso de la CPU y la memoria de Windows Azure?
- 11. Limitar la memoria de proceso/uso de CPU en Linux
- 12. ¿Cómo saber el uso de la CPU y la memoria de un proceso con WMI?
- 13. ¿Cómo puedo obtener el uso de la CPU y la memoria?
- 14. ¿Cómo mido el uso de CPU, memoria y disco durante una compilación?
- 15. ¿Cómo medir el uso de CPU y memoria del código F #?
- 16. ¿Monitorea el uso de la CPU por hilo en Java?
- 17. monitoreo de uso de la CPU Java
- 18. de Java a reducir el uso de CPU
- 19. ¿Utiliza PerformanceCounter para rastrear la memoria y el uso de la CPU por proceso?
- 20. cómo calcular el uso de Java arreglo de memoria
- 21. Serializable, clonable y uso de memoria en Java
- 22. pesada mysql uso de la CPU o la memoria
- 23. C++ CPU Registrar uso
- 24. ¿Cómo puedo obtener el uso de CPU y/o RAM de * THREAD * en C# (código administrado)?
- 25. Python/PySerial y uso de CPU
- 26. Diferencia de uso de memoria Java entre Linux y Windows
- 27. Seguimiento de hilos de memoria y consumo de CPU
- 28. ¿Cuál es el "costo" aproximado de un subproceso en ciclos de CPU y memoria?
- 29. ¿Cómo la CPU y la memoria son intensivas en el desarrollo de Android?
- 30. Uso y clasificación de la memoria SAS
posible duplicado de [Uso de Java para obtener nivel de sistema operativo información del sistema] (http://stackoverflow.com/questions/25552/using-java-to-get-os-level-system-information) –
Quizás estos enlaces sean útiles: http://www.javaworld.com/ javaworld/javaqa/2002-11/01-qa-1108-cpu .html http://www.roseindia.net/javatutorials/determining_memory_usage_in_java.shtml – chessguy