java - reubicacion - problemas que se presentan en la gestión de memoria
Medición del tiempo de ejecución de Java, el uso de la memoria y la carga de la CPU para un segmento de código (3)
Con ThreadMXBean puede obtener el uso de CPU de hilos individuales y el tiempo de CPU consumido en lugar de transcurrir un tiempo que puede ser útil.
Sin embargo, a menudo es más sencillo utilizar un generador de perfiles, ya que este proceso a menudo genera una gran cantidad de datos y necesita una buena herramienta de visualización para ver qué está sucediendo.
Uso Yourkit porque me resulta más fácil resolver problemas que otros profilers que he usado. También uso el hprof integrado ya que esto puede darle una vista diferente en el perfil de su aplicación (pero no tan útil)
Para un segmento particular de código Java, me gustaría medir:
- Tiempo de ejecución (más probable es el tiempo de ejecución de subprocesos )
- Uso de memoria
- Carga de CPU (específicamente atribuible al segmento de código)
Soy un principiante relativo de Java y no estoy familiarizado con cómo se podría lograr esto. He sido referido a JMX , sin embargo, no estoy seguro de cómo se podría utilizar, y JMX parece un poco "pesado" por lo que estoy buscando hacer.
Idealmente me gustaría algunas clases de medición que me puedan decir lo que me gustaría medir, con la opción de llamar a un método start()
antes de un segmento de código y luego a un método stop()
. Las métricas relevantes se registrarían en un archivo que especifique.
Por ejemplo:
import com.example.metricLogger;
metricLogger logger = new metricLogger();
logger.setLogPath(pathToLogFile);
logger.monitor(executionTime);
logger.monitor(memoryUsage);
logger.monitor(cpuLoad);
logger.start();
/* Code to be measured */
logger.stop();
¿Hay alguna forma estándar / común / convencional de lograr esto en Java?
Dichas mediciones son para comparaciones de rendimiento puntuales, por lo que no estoy buscando ningún proceso de supervisión a largo plazo en producción.
Estoy más que feliz de ser referido a tutoriales o ejemplos externos y no espero una respuesta completa aquí. Dicho esto, si se puede lograr algo tan simple como lo anterior, un ejemplo realista sería muy bueno.
La creación de perfiles puede ser una opción más fácil ya que no requiere estadísticas en producción. El perfilado tampoco requiere modificación de código. VisualVM (que se envía con el JDK 1.6.06+) es una herramienta simple. Si quieres algo más profundo, elegiría Eclipse TPTP, Netbeans profiler o JProfiler (pago).
Si quieres escribir tu propio, considera lo siguiente:
Se pueden hacer mediciones simples como el tiempo de ejecución "marcando" la sección que le interesa:
long start = System.nanoTime(); // requires java 1.5
// Segment to monitor
double elapsedTimeInSec = (System.nanoTime() - start) * 1.0e-9;
Puede utilizar una técnica similar para controlar la memoria a través de los métodos Runtime.getRuntime (). * Memory (). Tenga en cuenta que el uso de la memoria de seguimiento en un entorno de recolección de basura es más complicado que la simple resta.
La carga de la CPU es difícil de medir en Java, normalmente me quedo con el tiempo de ejecución y optimizo las secciones más largas / repetitivas
El uso de un Analizador de Java es la mejor opción y le dará toda la información que necesita sobre el código. viz Response Times, Thread CallTraces, Utilizaciones de memoria, etc.
Sugeriré JENSOR , un Analizador Java de código abierto, por su facilidad de uso y bajos gastos generales en la CPU. Puede descargarlo, instrumentar el código y obtener toda la información que necesita sobre su código.
Puede descargarlo de: http://jensor.sourceforge.net/