5 cosas que no sabía sobre la ... supervisión del rendimiento de Java, Parte 2

Supervisión del proceso Java con los perfiladores integrados de JDK

Si es nuevo para usted que JDK se envía con el perfilador completo JConsole, le ha sorprendido aún más el conocer las cinco utilidades autónomas para la creación de perfiles que se presentan en este artículo. Descubra como las superficiales (y en algunos casos experimentales) ™ herramientas de análisis y seguimiento de procesos Java pueden ayudarle a afinar los cuellos de botella de rendimiento, como la falta de hebras, los puntos muertos, y las fugas de objetos.

Ted Neward, Principal, Neward & Associates

Ted Neward photoTed Neward es el director ejecutivo de Neward & Associates, donde consulta, asesora, enseña, y presenta en Java, .NET, XML Services, y otras plataformas. Reside en los alrededores de Seattle, Washington.



16-05-2012

Sobre esta serie

¿Así que usted cree que sabe acerca de la programación Java? La realidad es que la mayoría de desarrolladores arañan la superficie de la plataforma Java, aprendiendo sólo lo justo para hacer su trabajo. En esta serie, Ted Neward ahonda debajo de la funcionalidad principal de la plataforma Java para descubrir hechos poco conocidos que podrían ayudarle a resolver incluso los retos de programación más pegajosos.

Los perfiladores integrados totalmente equipados como JConsole y VisualVM a veces cuestan más de lo que valen en sobrecargas de rendimiento, — en particular en los sistemas que se ejecutan en la producción de hardware. Por lo tanto, este segundo artículo se centra en la supervisión del rendimiento de Java, presentaré cinco herramientas de creación de perfiles de línea de comandos que permiten a los desarrolladores centrarse en un solo aspecto de un proceso de Java en ejecución.

El JDK incluye muchas utilidades de línea de comandos que se pueden utilizar para supervisar y gestionar el rendimiento de aplicaciones Java. Aunque la mayoría de ellas están etiquetadas como "experimentales" y por lo tanto sin soporte técnico, todavía son útiles. Algunas incluso podrían ser material de siembra para herramientas con fines especiales que se podrían compilar utilizando JVMTI o JDI (ver Recursos).

1. jps (sun.tools.jps)

Muchas herramientas de línea de comandos requieren que se identifique el proceso de Java que se desea supervisar. Esto no es tan diferente de otras herramientas similares que supervisan procesos de sistemas operativos nativos, y además requieren un identificador de proceso para funcionar.

El identificador "VMID" no siempre es el mismo que el identificador de proceso del sistema operativo nativo ("pid"), esa es la razón porque necesitamos la utilidad jps de JDK.

Uso de jps dentro de un proceso Java

Como con la mayoría de las herramientas que se incluyen en el JDK, y todas las herramientas mencionadas en este artículo, el jps ejecutable es en realidad un fino derivador alrededor de la clase o conjunto de clases Java que realizan la gran mayoría de los trabajos. En Windows,® las herramientas son archivos .exe que utilizan la API JNI invocation para llamar directamente a la clase en cuestión, en UNIX, ® la mayoría de herramientas son enlaces simbólicos a un script de shell que pone en marcha un iniciador genérico de Java con el nombre de clase correcto especificado.

Si desea utilizar la funcionalidad de jps (o de cualquier otra herramienta) desde dentro de un proceso Java — como un script de Ant — resulta relativamente fácil solamente llamar a main() en la clase que es la clase "principal" para cada herramientas. Para una fácil referencia, ese nombre de clase aparece entre paréntesis después de cada nombre de herramienta.

El jps— cuyo nombre refleja la utilidad ps que se puede encontrar en la mayoría de sistemas UNIX — nos dice el JVMID de una aplicación Java en ejecución. Como su nombre implica, el jps devuelve los VMID para todos los procesos Java por descubrir que se ejecutan en una máquina determinada. Si el jps no descubre un proceso, no significa que el proceso Java no se puede adjuntar o explorar. Sólo significa que no se anuncia como disponible.

Si se puede encontrar el proceso Java, el jps enumerará la línea de comandos que se utiliza para lanzarlo. Esta forma de diferenciar entre los procesos Java es importante porque en lo que se refiere al sistema operativo, todos los programas Java son java.." Para la mayoría de los propósitos, el VMID es el número importante a tener en cuenta.

Iniciación con los perfiladores

La manera más fácil de iniciarse con las utilidades de creación de perfiles es utilizar un programa de demostración como la demo SwingSet2 que se encuentra en demo/jfc/SwingSet2.. Con esto se evitan las potenciales caídas con procesos en ejecución como los procesos background/daemon.Una vez que se familiarice con la herramienta y sus sobrecargas, puede probarla en sus programas reales.

Cuando haya terminado de cargar la aplicación de demostración, ejecute jps y observe el vmid que se devuelve.. Para un mejor efecto, lanzar del programa Java con el -Dcom.sun.management.jmxremote adecuadamente establecido. Si usted no utiliza esta configuración, algunos datos recogidos por algunas de las herramientas que se mencionan a continuación no se encontrarán disponibles.


2. jstat (sun.tools.jstat)

La utilidad jstat se puede utilizar para recoger una variedad de estadísticas diferentes. Las estadísticas de jstat se ordenan en "opciones" que se especifican en la línea de comandos como el primer parámetro. Como en JDK 1.6, se puede visualizar la lista de opciones disponible ejecutando jstat con el comando -options. Algunas opciones se muestran en el Listado 1:

Listado 1. opciones jstat
-class
-compiler
-gc
-gccapacity
-gccause
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-printcompilation

La documentación JDK de la utilidad (ver Recursosle dirá que cada una de las opciones en el Listado 1 retornan, pero la mayoría de ellas se utilizan para reunir información sobre el rendimiento del recopilador de basura, o sólo componentes de él. La opción -class revela las clases de carga y descarga (convirtiéndola en una gran utilidad para la detección de fugas ClassLoader dentro del servidor de la aplicación o el código), y tanto el -compiler como el -printcompilation muestran información acerca del compilador Hotspot JIT.

De forma predeterminada, jstat mostrará la información en el momento que usted la compruebe. Si desea instantáneas tomadas a intervalos regulares, especifique los intervalos en milisegundos después del comando -options . El jstat mostrará continuamente instantáneas de la información del proceso de supervisión. Si usted desea que jstat tome un número determinado de instantáneas antes de terminar, especifique ese número después del valor de intervalo/período.

Si 5756 era el VMID de un proceso SwingSet2 en ejecución que comenzó hace unos minutos, entonces el comando siguiente dirá ajstat que genere un volcado de instantánea de gc cada 250 milisegundos para 10 interacciones, a continuación abandona:

jstat -gc 5756 250 10

Tenga en cuenta que Sun (ahora Oracle) se reserva el derecho de cambiar la salida de las distintas opciones, o incluso las propias opciones, sin previo aviso. Ese es el inconveniente de utilizar utilidades sin soporte. Ver Javadocs para más detalles acerca de cada una de las columnas de la salida jstat .


3. jstack (sun.tools.jstack)

Conociendo lo que sucede dentro de un proceso Java con respecto a las hebras de ejecución son un reto de diagnostico común. Por ejemplo, cuando una aplicación ha dejado de procesar de repente, es obvio que se ha alcanzado algún tipo de inanición, pero no resulta obvio sólo con mirar el código donde ha ocurrido la inanición, o por qué.

jstack es una utilidad que devuelve un volcado completo de las diversas hebras que se ejecutan en una aplicación, la cual se puede entonces utilizar para identificar el problema.

Ejecutando jstack con el VMID del proceso deseado generará un volcado de pila. En este sentido, jstack funciona igual que presionando Ctrl-Break en la ventana de la consola en la que se está ejecutando un programa Java , o llamando a Thread.getAllStackTraces() o Thread.dumpStack() en cada uno de los objetos Hebra en la VM. Una llamada a jstack también vuelca información acerca de las hebras no-Java que se ejecutan dentro de la VM, que no siempre están disponibles como objetos Hebra .

El parámetro de jstack-l ofrece hasta un vuelco un poco más largo que incluye información más detallada sobre el bloqueo realizado por cada una de las hebras de Java, y por lo tanto puede ser muy valiosa en la búsqueda (¡y el aplastamiento!) delos puntos muertos o errores de escalabilidad.


4. jmap (sun.tools.jmap)

A veces, el problema con el que está tratando es una fuga de objeto, como una ArrayList (que puede contener miles de objetos) que simplemente no se publicaron cuando se debieron. Otro problema más general sería un almacenamiento dinámico de expansión que no parece que disminuya nunca, a pesar de una activa recogida de basura.

Cuando usted está intentando localizar una fuga de objeto, resulta increíblemente útil tomar una imagen del almacenamiento dinámico en un momento dado en el tiempo, y a continuación mirar a través de lo que hay allí. jmap proporciona el primer componente de esa funcionalidad tomando una imagen instantánea del almacenamiento dinámico. Entonces usted puede analizar los datos del almacenamiento dinámico por medio de la utilidadjhat que se describe en la siguiente sección.

El uso de jmap es sencillo, como el resto de utilidades que aquí se describen.Simplemente apunte jmap en el VMID del proceso Java del que quiere la instantánea, y proporcione algunos parámetros de descripción del archivo generado resultante. Las opciones que serán transmitidas a jmap consisten en el nombre del archivo que se vuelca y si se utiliza un archivo de texto o un archivo binario. Un archivo binario es la opción más útil, pero sólo cuando se combina con algún tipo de herramienta de indexación, — el trabajar muy duro de forma manual a través de varios megabytes de texto lleno de valores hexadecimales no es la mejor forma de pasar el día.

Para una vistazo más informal del almacenamiento dinámico de Java, jmap también soporta una opción -histo . -histo genera un histograma de texto de los objetos a los que en la actualidad se hace una fuerte referencia en el almacenamiento dinámico, ordenados por el número total de bytes consumidos por ese tipo en particular. Además se da el número total de instancias para ese tipo en particular, lo que permiten algunos cálculos y suposiciones primitivas acerca de los costos relativos por instancia.

Desafortunadamente, jmap no tiene una opción de recuento de período-y-máximo como la de jstat , pero es relativamente fácil el poner llamadas a jmap (o a jmap.main()) en un bucle, ya sea en un script de shell u otra clase para tomar instantáneas periódicamente. (De hecho, esto sería una buena ampliación para añadir a jmap, ya sea como un parche de fuente a la propia OpenJDK o como una extensión a otra utilidad.)


5. jhat (com.sun.tools.hat.Main)

Una vez que ha volcado el almacenamiento dinámico en un archivo binario, se puede utilizar jhat para analizar el archivo de volcado de almacenamiento dinámico binario. jhat crea un servidor HTTP/HTML que puede ser navegado en un buscador, proporcionando una vista de objeto-por-objeto del almacenamiento dinámico congelado en el tiempo. Mientras que podría ser divertido caminar a través del almacenamiento dinámico, referencia de objeto por referencia de objeto, probablemente usted esté mejor servido haciendo una especie de análisis automatizado de todo el enredo. Por suerte, jhat soporta una sintaxis OQL para hacer ese análisis.

Por ejemplo, ejecutar una consulta OQL para todas las Cadena de caracteres con más de 100 caracteres se parecería a esto:

seleccionar s desde java.lang.String s donde s.count >= 100

Los resultados se muestran como enlaces a los objetos, los cuales muestran a continuación el contenido completo de ese objeto, las referencias de campo a otros objetos como enlaces adicionales que pueden ser desreferenciados. Las consultas OQL también puede invocar métodos de los propios objetos, utilizar expresiones regulares como parte de la consulta, y utilizar herramientas integradas de consulta. Una herramienta de consulta, la función referrers() , muestra todos los referentes que relacionan a un objeto de un determinado tipo. Aquí está la consulta para encontrar todos los referentes de los objetos deFile :

seleccionar referrers(f) desde java.io.File f

Puede encontrar la sintaxis completa de OQL y sus dispositivos en la página "OQL Help" dentro del entorno del navegador de jhat . El combinar jhat con OQL es una poderosa manera de realizar una investigación destinada a un mal comportamiento del almacenamiento dinámico.


En conclusión

Las extensiones de creación de perfiles de JDK pueden ser muy útiles cuando usted necesita obtener una visión más cercana a lo que está pasando dentro de un proceso de Java. Todas las herramientas presentadas en este artículo pueden ser utilizadas por ellas mismas desde la línea de comandos. Además pueden ser poderosamente combinadas con JConsole o VisualVM. Mientras que JConsole y VisualVM proporcionar una gran visión de Java virtual machine, herramientas específicamente orientadas como jstat y jmap le dejan afinar la investigación.

Próximamente en las series 5 cosas: scripting.

Recursos

Aprender

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=tecnologia Java
ArticleID=813847
ArticleTitle=5 cosas que no sabía sobre la ... supervisión del rendimiento de Java, Parte 2
publish-date=05162012