it-swarm-es.tech

¿Cómo verifico el uso de CPU y memoria en Java?

Necesito verificar el uso de la CPU y la memoria del servidor en Java. ¿Alguien sabe cómo podría hacerse?

92
Johnny Bou

Si buscas específicamente en 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, estos deben tomarse sólo una estimación ...

68
Jeremy
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();
    }
}
19
Dave

Si está utilizando la JVM de Sun y está interesado en el uso de la memoria interna de la aplicación (cuánto de la memoria asignada está usando su aplicación), prefiero activar el registro de recolección de basura integrado en las JVM. Simplemente agregue -verbose: gc al comando de inicio.

De la documentación del sol:

El argumento de la línea de comando -verbose: gc imprime información en cada colección. Tenga en cuenta que el formato de la salida -verbose: gc está sujeto a cambios entre las versiones de la plataforma J2SE. Por ejemplo, aquí sale 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 una mayor. Los números antes y después de la flecha.

325407K->83000K (in the first line)

indique el tamaño combinado de los objetos vivos antes y después de la recolección de basura, respectivamente. Después de las colecciones menores, el recuento incluye objetos que no están necesariamente vivos pero que no se pueden recuperar, ya sea porque están directamente vivos, o porque están dentro o referenciados por la generación titular. El numero entre paréntesis

(776768K) (in the first line)

es el espacio total disponible, sin contar el espacio en la generación permanente, que es el montón total menos uno de los espacios de sobrevivientes. La colección menor tomó alrededor de un cuarto de segundo.

0.2300771 secs (in the first line)

Para obtener más información, consulte: http://Java.Sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

17
unknown (yahoo)

Desde aquí

    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);
15
danieln

JMX, los MXBeans (ThreadMXBean, etc.) proporcionados le darán usos de memoria y CPU.

OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
operatingSystemMXBean.getSystemCpuLoad();
9
Javamann

Para el uso de la memoria, lo siguiente funcionará,

long total = Runtime.getRuntime().totalMemory();
long used  = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

Para el uso de la CPU, necesitará usar una aplicación externa para medirla.

8
Rich Adams

Desde Java 1.5, el JDK viene con una nueva herramienta: JConsole que puede mostrar el uso de CPU y 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, puntos muertos, subprocesos, etc.

5
Telcontar

Si usa la solución runtime/totalMemory que se ha publicado en muchas respuestas aquí (lo he hecho mucho), asegúrese de forzar dos recolecciones de basura primero si desea obtener resultados bastante precisos y consistentes.

Por eficiencia, Java generalmente permite que la basura llene toda la memoria antes de forzar un GC, y aun así no suele ser un GC completo, por lo que sus resultados para runtime.freeMemory () siempre estarán en algún lugar entre la cantidad "real" de memoria libre y 0 .

El primer GC no lo consigue todo, lo consigue casi todo.

La mejora es que si solo haces la llamada FreeMemory (), obtendrás un número que es absolutamente inútil y varía ampliamente, pero si el primero de 2 gc es un indicador muy confiable. También hace que la rutina MUCHO más lenta (segundos, posiblemente).

4
Bill K

Java Runtime object puede reportar el uso de memoria de la JVM. Para el consumo de la CPU, tendrá que usar una utilidad externa, como la parte superior de Unix o el Administrador de procesos de Windows.

3
moonshadow

Aquí hay un código simple para calcular el uso de memoria actual en megabytes:

double currentMemory = ( (double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024));
2
Phil

También agregaría la siguiente forma de rastrear la carga de 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();
}

Puedes leer más aquí

2
sbeliakov

JConsole es una forma fácil de monitorear una aplicación Java en ejecución o puede usar un Perfilador para obtener información más detallada sobre su aplicación. Me gusta usar NetBeans Profiler para esto.

1
blahspam

El YourKit Java profiler es una excelente solución comercial. Puede encontrar más información en los documentos en Perfiles de CPU y Perfiles de memoria .

1
Gregg

Si está utilizando Tomcat, consulte Psi Probe , que le permite controlar el consumo de memoria interna y externa, así como un host de otras áreas.

1
Tim Howland

Para Eclipse, puede usar TPTP (plataforma de herramientas de prueba y rendimiento) para analizar el uso de la memoria y etc. más información

0
Fuangwith S.