El perfilado de Java es el proceso de monitorización de varios parámetros a nivel de la JVM como la ejecución de métodos, la ejecución de hilos, la creación de objetos y la recolección de basura.Puede obtener los volcados de hilos como un archivo de registro de todos los procesos que se están ejecutando en JVM.Un volcado de hilos es una instantánea del estado de todos los hilos que forman parte del proceso específico.
En linux dando el comando ‘jps’ (herramienta de estado del proceso JVM) puede obtener las máquinas virtuales Java HotSpot instrumentadas (JVMs) en el sistema de destino con su correspondiente ID de proceso.
Figura 1- JVMs y sus pids.
El comando ‘jps -l ‘ muestra el nombre completo del paquete de la clase principal de la aplicación o el nombre completo de la ruta del archivo JAR de la aplicación.Consulte la documentación de jps para obtener más información.
Después de eso podemos usar el comando ‘jstack’ para capturar los volcados de hilos. la herramienta jstack se envía en la carpeta JDK_HOME/bin. Aquí está el comando que usted necesita para emitir a la captura de volcado de hilo: jstack <pid>. Aquí pid es el ID del proceso de la aplicación, cuyo volcado de hilos debe ser capturado. Así que ‘jstack 13626’ en mi consola mostrará el siguiente registro de volcado de hilos como se muestra en la figura.
Herramientas de perfilado construidas y su implementación
Además de estas hay varias herramientas construidas para hacer el perfilado de JVM como Java VisualVM,Honest Profiler, Async Profiler y Java Mission Controller
Antes de profundizar en estos perfiladores debemos conocer el concepto de ‘Safe point’. JVM internamente se encarga de muchas cosas por nosotros, como Garbage Collection y JIT Compilation. Así que la JVM también necesita su propio tiempo para resolver algunas cosas por sí misma, fuera de la aplicación. Algunas de las cosas que JVM puede hacer pueden implicar un safepoint (incluyendo GC). Durante un safepoint, todos los hilos que ejecutan código Java se suspenden para que JVM haga su trabajo. La aplicación se detiene durante el tiempo que la JVM va a un safepoint.Así que algunos perfiladores sufren de estos problemas de safepoint donde dan una devolución de llamada a los hilos especificados, esos hilos deben estar en un safepoint para responder a esa devolución de llamada.Por lo tanto, afecta al rendimiento.
Por otro lado, algunos perfiladores utilizan una llamada de la API interna de openJDK AsyncGetCallTrace (ASGT) para facilitar la recolección de stack traces sin safepoint. AsyncGetCallTrace no es una API oficial de la JVM. Para utilizar ASGT, primero hay que crear un agente JVMTI. La Java Virtual Machine Tool Interface (JVMTI) proporciona una interfaz de programación que le permite a usted, el desarrollador de software, crear agentes de software que pueden supervisar y controlar sus aplicaciones de lenguaje de programación Java.Esa señal se dirigirá a la JVM en ejecución y uno de sus hilos en ejecución se interrumpirá y llamar de nuevo a nuestro controlador de señales.Asegúrese de que el hilo interrumpido se ejecuta en su controlador de señales y llamar a la AGCT.Honest profiler utilizar este ASGT para hacer perfiles.
The Honest profiler tiene dos partes a la misma. Un agente de C++ JVMTI que escribe un archivo que contiene toda la información de perfilado sobre la aplicación a la que se adjuntó el agente jvmti.La segunda parte, es una aplicación Java que rinde un perfil basado en este registro que se generó previamente.
El método ASGT se verá así. AsyncGetCallTrace(ASGCT_CallTrace *trace,jint depth,void* ucontext).Deberíamos pasar un puntero a la traza de la llamada ASGT a este método.
El problema de este enfoque es que se obtienen datos ligeramente diferentes a los de una traza de pila típica de Java. El perfilador tiene que procesarlo y asignarlo a las líneas del código fuente para que sea útil.
Async profiler es un perfilador de muestreo de baja sobrecarga que opera adjuntando un agente nativo de Java a un proceso JVM en ejecución y recogiendo las muestras de stack traces mediante el uso de APIs específicas de HotSpot. Async-profiler funciona sólo en GNU/Linux y MacOS, y en el primero, utiliza además perf_events para indagar también en el código nativo. El enfoque general consiste en recibir las pilas de llamadas generadas por perf_events y compararlas con las pilas de llamadas generadas por AsyncGetCallTrace, con el fin de producir un perfil preciso tanto del código Java como del nativo. Utiliza la API perf_events para configurar el muestreo de la CPU en un búfer de memoria, y pide que se entregue una señal cuando se produce un muestreo. El controlador de señales llama entonces a AGCT, y fusiona las dos pilas: la pila de Java, capturada por AGCT, y la pila nativa + kernel, capturada por perf_events. Para los hilos que no son Java, sólo se conserva la pila perf_events.
Java Mission Controller(JMC) da un informe detallado de cada uno de los hilos específicos en cada JVM y su porcentaje de consumo de CPU de una manera eficiente.Java Mission Control funciona mediante la interacción con un agente JMX en la JVM que tiene un servidor MBean que se integra con la VM construida y la instrumentación de la aplicación que se ejecuta en la JVM. Esta es una ventaja clave, ya que realmente reduce el coste de los gastos generales de la herramienta, ya que utiliza ganchos preexistentes. Oracle afirma que esto es normalmente muy por debajo de un 1% de sobrecarga.Aquí no hay nada que usted necesita para instalar o adjuntar a su VM existente para conseguir que funcione. Con Flight recorder, hay un par de banderas que necesitas habilitar, pero nada que instalar. Inicie una terminal, vaya al directorio bin del JDK y escriba jmc.JMC mostrará una interfaz gráfica que contiene sus JVMs en ejecución.Seleccione el proceso JVM que necesita perfilar y comience a grabar especificando el límite de tiempo.
Otra alternativa popular es usar Linux perf, que no soporta directamente Java pero tiene un gran soporte para perfilar código nativo, y no tiene ningún problema en mirar las pilas del kernel también. Para el soporte de JVM necesitamos un mapa perf que mapee las direcciones compiladas en JIT a los nombres de las funciones (como corolario, sólo se soportan los frames compilados; los frames del intérprete son invisibles)
Y un switch JIT -XX:+PreserveFramePointer que asegure que perf pueda recorrer la pila de Java. Cuando se utiliza este tipo de enfoque, se pierden los marcos de interpretación y no se puede perfilar una JVM antigua que no tenga la bandera PreserveFramePointer. Puede haber algunas entradas viejas en su perfmap porque el JIT puede recompilar el código. Como el JIT está tirando algo de código, algunas funcionalidades pueden terminar con una implementación inadecuada.
Además de esto, la Plataforma Java 2 Standard Edition (J2SE) siempre ha proporcionado una sencilla herramienta de perfilado de línea de comandos llamada HPROF para el perfilado de heap y cpu. HPROF es una herramienta incorporada en el JDK para perfilar el uso de la CPU y el heap dentro de una JVM.HPROF es en realidad una biblioteca de agente nativo de la JVM que se carga dinámicamente a través de una opción de línea de comandos, en el inicio de la JVM, y se convierte en parte del proceso de la JVM. Al suministrar las opciones de HPROF en el inicio, los usuarios pueden solicitar varios tipos de características de perfilado de heap y/o cpu a HPROF. Los datos generados pueden estar en formato textual o binario, y pueden ser utilizados para rastrear y aislar problemas de rendimiento relacionados con el uso de la memoria y el código ineficiente. El archivo en formato binario de HPROF puede usarse con herramientas como HAT para examinar los objetos asignados en el heap.
Conclusión
Observamos que el perfilado honesto y el perfilado Async han superado la anomalía de ‘Sufrir puntos de seguridad’ mediante una llamada a la API interna de openJDK AsyncGetCallTrace.Pueden realizar el perfilado con mucha menos sobrecarga que las herramientas de perfilado estándar, pero no pueden proporcionar un perfilado detallado de los hilos que son específicos de los procesos de la JVM por separado.Por otro lado, Java Mission Control puede perfilar los hilos que son específicos de cada proceso por separado, donde se pueden supervisar los hilos calientes con su uso de la CPU.Por lo tanto, JMC es la mejor opción para supervisar los parámetros de la JVM con mucha granularidad.
Referencias.
Herramienta de Estado del Proceso de la Máquina Virtual de Java Documentación de Oracle.
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html
Creación de un agente de depuración y perfilado con JVMTI
http://www.oracle.com/technetwork/articles/java/jvmti-136367.html
Los pros y los contras de los perfiladores AsyncGetCallTrace
http://psy-lob-saw.blogspot.com/2016/06/the-pros-and-cons-of-agct.html
Un perfilador de la JVM de muestreo sin el sesgo de muestreo de safepoint-.Honest Profiler
https://github.com/jvm-profiling-tools/honest-profiler
Perfilador de muestreo de CPU y HEAP para Java con AsyncGetCallTrace + perf_events
https://github.com/jvm-profiling-tools/async-profiler