Supervisar y diagnosticar el rendimiento en Java SE 6

Aprovechar las mejoras de rendimiento y supervisión de el último release de Java

La Plataforma Java™ , Standard Edition 6 (Java SE) se centra en el rendimiento, con herramientas ampliadas para gestionar y supervisar aplicaciones, así como para diagnosticar problemas comunes. En este artículo se describe la base de supervisión y gestión en la plataforma Java SE y se proporciona información detallada acerca de las mejoras pertinentes en Java SE 6.

Cathy Kegley, Software Engineer, IBM

Cathy Kegley es un ingeniero de Software de IBM en el equipo de clientes de Lotus Expeditor.



Greg Roberts, Staff Software Engineer, IBM

Greg Roberts es un ingeniero de Software en plantilla de IBM en el equipo de desarrollo de clientes de Lotus Expeditor.



30-04-2012

Java SE 6 proporciona un enfoque profundo sobre el rendimiento, ofrece herramientas ampliadas para gestionar y supervisar aplicaciones y para diagnosticar problemas comunes. las mejoras incluyen:

  • La supervisión y gestión de las API mejoradas.
  • Soporte oficial de una herramienta de supervisión gráfica mejorada llamada JConsole.
  • Instrumentación mejorada de Java virtual machine (JVM)

En este artículo se describe la base de supervisión y gestión en la plataforma Java SE y proporciona información detallada acerca de las mejoras pertinentes en los últimos releases . También se describen las herramientas de diagnóstico y resolución de problemas disponibles para la plataforma Java SE 6.

Para beneficiarse de este artículo, se debe tener un sólido entendimiento de la funcionalidad de gestión y supervisión introducidas en los releases anteriores de Java SE. Consulte Recursos, para una detallada información.

API de gestión y supervisión

El paquete java.lang.management introducido en Java SE 5 define nueve MBeans llamadas plataforma MBeans, o MXBeans (vea Recursos). Cada MXBean encapsula una sola área funcional de la JVM. Comenzando con Java SE 5, la JVM tiene incorporado un servidor de MBean llamado servidor de plataforma MBean. . Los MBeans residen y están administrados a través de este repositorio. La Tabla 1 describe los nueve MXBeans en la plataforma Java:

Tabla 1. Plataforma MBeans
Interfaz de gestiónRecurso administrado
ClassLoadingMXBeanCargador de clases
CompilationMXBeanCompilador
MemoryMXBeanMemoria
ThreadMXBeanHebras
RuntimeMXBeanTiempo de ejecución
OperatingSystemMXBeanSistema operativo
GarbageCollectorMXBeanRecopilador de basura
MemoryManagerMXBeanGestor de memoria
MemoryPoolMXBeanAgrupación de memoria

Cualquier aplicación puede obtener y utilizar los MBeans de la plataforma proporcionados por la JVM mediante la obtención de una instancia del bean deseado e invocando los métodos adecuados. Los MXBeans se puede utilizar para supervisar el comportamiento de las JVM locales y remotas y recuperar información acerca de ellas.

Los MBeans de la plataforma proporcionan acceso a información como por ejemplo el número de clases cargadas, el tiempo de funcionamiento de la JVM, la cantidad de memoria consumida, y el número de hebras en ejecución, así como estadísticas sobre la contención de hebras.

Se pueden supervisar y gestionar los recursos de JVM de una de dos formas:

  • Acceso directo a la interfaz MXBean .
  • Acceso indirecto por medido de la interfaz MBeanServer .

Acceso directo por medio de la interfaz MXBean.

Se puede recuperar una instancia MXBean desde un método de fábrica estática que le proporciona acceso directo a la interfaz MXBeam de JVM que se ejecuta localmente . La clase ManagementFactory proporciona los métodos de fábrica estática para obtener los MXBeans. El ejemplo del Listado 1 demuestra cómo recuperar el RuntimeMXBean utilizando esta fábrica y obtener el valor de uno de sus atributos estándar: VmVendor:

Listado 1. Acceso directo a MXBean
RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean();

// Get the standard attribute "VmVendor"
String vendor = mxbean.getVmVendor();

Acceso indirecto utilizando la interfaz MBeanServer

La interfaz MBeanServer de la plataforma utiliza MXBeanServerConnection para permitirle conectarse a las JVM remotas y acceder a los MXBeans que se ejecutan en esas plataformas. Se puede utilizar el método getPlatformMBeanServe de la clase ManagementFactory para acceder al servidor MBean de la plataforma. El Listado 2 demuestra cómo obtener el RuntimeMXBean ejecutándose en una JVM remota y obtener el valor de su atributo VmVendor :

Listado 2. Acceso indirecto a MXBean
MBeanServerConnection serverConn;

try {
   //connect to a remote VM using JMX RMI
   JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://<addr>");

   JMXConnector jmxConnector = JMXConnectorFactory.connect(url);

   serverConn = jmxConnector.getMBeanServerConnection();

   ObjectName objName = new 
   ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME);

   // Get standard attribute "VmVendor"
   String vendor = 
   (String) serverConn.getAttribute(objName, "VmVendor");

} catch (...) { }

Consulte Recursos para más información detallada de los MXBeans y de la API java.lang.management .

Mejoras API en Java SE 6

Java SE 5 presenta el paquete java.util.concurrent.locks , que proporciona una infraestructura para las condiciones de bloqueo y espera. Esta infraestructura es distinta del soporte de sincronización integrado de Java y permite una mayor flexibilidad en el uso de bloqueos.

Java SE 6 añade soporte para java.util.concurrent.locks en el paquete java.lang.management . Esto incluye nuevas clases que proporcionan información sobre los bloqueos, así como mejoras en las interfaces ThreadInfo, ThreadMXBean y OperatingSystemMXBean .

Java SE 6 introduce dos nuevas clases:

  • LockInfo contiene información sobre un bloqueo.
  • MonitorInfo amplia LockInfo y contiene información sobre un bloqueo supervisor de objetos.

La clase ThreadInfo hace uso de estos nuevos objetos con la introducción de tres nuevos métodos:

  • getLockInfo() devuelve el objeto LockInfo para el que la hebra dada está esperando bloqueada.
  • getLockedMonitors() devuelve el objeto MonitorInfo que está actualmente bloqueado por la hebra dada.
  • getLockedSynchronizers() devuelve el objeto LockInfo que representa los sincronizadores posibles que están actualmente bloqueados por la hebra dada.

En Java SE 5, los métodos ThreadMXBean.getThreadInfo informan sólo de la supervisión de un objeto que una hebra está esperando adquirir o está bloqueado para entrar. En Java SE 6, estos métodos se han mejorado para informar al AbstractOwnableSynchronizer que una hebra está esperando para adquirir.

Se han añadido cuatro nuevos métodos a la interfaz ThreadMXBean :

  • isObjectMonitorUsageSupported() prueba si la máquina virtual soporta el control de uso de los supervisores de objetos.
  • isSynchronizerUsageSupported() prueba si la máquina virtual soporta el control de uso de los sincronizadores posibles.
  • findDeadlockedThreads() devuelve una matriz de ID de hebra que están en punto muerto. Las hebras que están en punto muerto están bloqueando las unas a las otras la entrada de un sincronizador o supervisor de objetos.
  • dumpAllThreads() devuelve el rastreo de pila y la sincronización para todas la hebras vivas.

Por último, la interfaz OperatingSystemMXBean fue actualizada para incluir el método getSystemLoadAverage() , que devuelve el promedio de carga del sistema del último minuto.

Además de este soporte programático, Java SE 6 también incluye diversas herramientas de diagnósticos y de resolución de problemas que se pueden utilizar para detectar problemas y controlar el uso de los recursos de JVM. Las dos secciones siguientes describen y demuestran algunas de las herramientas de diagnóstico disponibles.


Consola de Gestión y Supervisión Java (JConsole)

Java SE 6 incluye soporte oficial para JConsole, una consola de supervisión y de gestión presentada en Java SE 5. JConsole le permite controlar varias estadísticas de recursos de JVM en tiempo de ejecución. Es particularmente útil para detectar síntomas de puntos muertos, contención de bloqueos, fugas de memoria, y hebras de ciclado. Se puede conectar a una JVM local o remota y se puede utilizar para supervisar:

  • El estado de la hebras (incluyendo los bloqueos asociados)
  • El uso de memoria
  • La recogida de basura
  • Información de tiempo de ejecución
  • Información JVM

Las siguientes subsecciones describen las mejoras realizadas a JConsole en Java SE 6. Ver Recursos para más información de cómo empezar a utilizar JConsole.

Soporte de Attach API

Desde Java SE 6, JConsole implementa la nueva Attach API. Esta API contiene dos paquetes —com.sun.tools.attach y com.sun.tools.attach.spi,— que permiten la implementación de aplicaciones de forma dinámica adjuntas a una máquina virtual de destino y ejecutar a sus agentes dentro de esa JVM.

En el pasado, las aplicaciones que usted quería supervisar con JConsole tenían que iniciarse con la opción -Dcom.sun.management.jmxremote ; las aplicaciones ya no tienen que iniciarse más con esta opción. El Soporte para el accesorio dinámico hace que JConsole pueda supervisar cualquier aplicación que soporte la Attach API. Las aplicaciones compatibles son detectadas automáticamente cuando se inicia JConsole.

Presentación de Enhaced UI y MBean

En Java SE 6, JConsole ha sido actualizada para que tenga un sensación parecida al sistema operativo de Windows® o al desktop de GNOME, dependiendo de la plataforma que se está ejecutando. Las capturas de pantalla que muestran el resto de este artículo en su totalidad fueron tomadas en Windows XP y en ellas aparecen los dispositivos de UI que han cambiado desde el release anterior.

Una vez iniciado y asociado a una aplicación, la vista de JConsole cotiene seis pestañas, cada una representa un recurso o conjunto de recursos de JVM diferentes:

  • Visión general
  • Memoria
  • Hebras
  • Clases
  • Resumen de VM
  • MBeans

La pestaña Visión General muestra información correlacionada sobre el uso de la memoria, hebras, clases y uso de la CPU en un formato gráfico. La pestaña Visión General muestra un conjunto de información relacionada en una página que estaba disponible anteriormente sólo conmutando entre varias pestañas. La Figura 1 muestra la pestaña Visión General de una aplicación de muestra:

Figura 1. Pestaña Visión General de JConsole
Pestaña Visión General de JConsole

Haga clic para ampliar la imagen

Figura 1. Pestaña Visión General de JConsole

Pestaña Visión General de JConsole

La pestaña Visión General muestra cuatro gráficos de información de uso de recursos de la VM, así como una lista de selección para modificar el intervalo de tiempo en el cual le gustaría ver los resultados. El primer gráfico, Uso de la memoria de almacenamiento dinámico, muestra la cantidad de memoria de almacenamiento dinámico que se ha utilizado en megabytes con el tiempo. Este gráfico es útil para detectar fugas de memoria. Si se produce una fuga de memoria en su aplicación, el uso de la memoria de almacenamiento dinámico aumenta regularmente con el tiempo.

El gráfico de Hebras traza el número de hebras vivas con el tiempo, y el gráfico de Clases representa el número de clases cargadas. El gráfico de Uso de la CPU representa el porcentaje de CPU que utiliza la aplicación en varios puntos de su ciclo de vida.

La pestaña Resumen de VM, que se muestra en la Figura 2, es otra nueva adición de el release Java SE 6. Se proporciona información detallada sobre la JVM, incluyendo el tiempo de funcionamiento total, la información de enhebrado, las clases cargadas, las estadísticas de la memoria, la recogida de basura, y la información del sistema operativo.

Figura 2. Pestaña Resumen de VM de JConsole
Pestaña Resumen de VM de JConsole

Haga clic para ampliar la imagen

Figura 2. Pestaña Resumen de VM de JConsole

Pestaña Resumen de VM de JConsole

La pestaña MBeans se ha mejorado para permitir un acceso más fácil a sus operaciones y atributos de MBeans. Muestra información sobre todos los MBeans registrados en la plataforma. Se puede acceder a todas las MBeans de la plataforma a través de esta pestaña. La estructura de árbol a lo largo del lado izquierdo muestra todos los MBeans actualmente en ejecución. Cuando usted selecciona un MBean, su MBeanInfo y descriptor aparecen en la tabla de la derecha, como se muestra en la Figura 3:

Figura 3. Pestaña JConsole MBean
Pestaña JConsole MBean

Seleccionando el nodo Atributes muestra todos los atributos de MBean, como aparece en la Figura 4 para el enhebrado MBean:

Figura 4. Atributos MBean
Atributos MBean

Observe los atributos y sus valores que aparecen en el recuadro del mapa derecho de los valores de atributo alcanzables a través de la API ThreadMXBean en el paquete java.lang.management anteriormente descrito. Se puede obtener información adicional acerca de un atributo enumerado haciendo doble clic sobre el valor del atributo. Sólo se pueden ampliar los valores del atributo que se muestran en negrita. Por ejemplo, haciendo doble clic en el valor AllThreadIds muestra los ID de hebra de todas las 22 hebras, como aparece en la Figura 5:

Figura 5. Valor del atributo ampliado
Valor del atributo ampliado

Los atributos grabables aparecen en azul y se pueden editar haciendo clic en ellos e introduciendo el nuevo valor. Por ejemplo, el atributo ThreadContentionMonitoringAvailable que aparece en la Figura 5 se puede editar de esta manera desde la vista de JConsole.

Seleccionando el nodo Operaciones en la estructura del árbol de la izquierda muestra las operaciones que están asociadas a ese MBean. Las operaciones MBean aparecen como botones en el lado derecho de la pantalla, y cuando se hace clic en ellos, invocan el método especificado. La Figura 6 muestra las operaciones disponibles para ThreadMXBean:

Figura 6. Operaciones MBean
Operaciones MBean

El HotSpot Diagnostic MBean

En Java SE 6, JConsole incluye soporte para el HotSpot Diagnostic MBean. Este MBean fue introducido en este release para permitirle realizar operaciones de diagnóstico en el mismo momento. Su API deja a los usuarios llevar a cabo un vuelco de almacenamiento dinámico y establece otras opciones de la VM durante el tiempo de ejecución. Se puede acceder al HotSpot Diagnostic MBean desde la pestaña MBean expandiendo el nodo com.sun.management y seleccionando HotSpotDiagnostic.. Los métodos disponibles desde HotSpot Diagnostic MBean se muestran en la Figura 7:

Figura 7. HotSpot Diagnostic MBean
HotSpot Diagnostic MBean

Soporte plug-in de JConsole

A partir de Java SE 6, JConsole incluye el soporte plug-in que le permite compilar sus propios plug-ins para ejecutarlos con JConsole. Por ejemplo, puede añadir una pestaña personalizada a la vista principal de JConsole para acceder a MBeans de aplicaciones específicas y para llevar a cabo sus propias actividades de supervisión.

Se debe ampliar la clase abstracta com.sun.tools.jconsole.JConsolePlugin para crear un plug-in personalizado en JConsole.Usted implementa dos métodos para que aparezca correctamente un plug-in en la vista de JConsole:

  • newSwingWorker() devuelve un objeto SwingWorker que lleva a cabo las actualizaciones GUI para su plug-in.
  • getTabs() devuelve un mapa de las pestañas que se añaden a la ventana de JConsole.

JConsole utiliza su mecanismo de proveedor de servicios para detectar y cargar todas las clases de plug-in. Por esta razón, usted debe proporcionar su clase de plug-in en un archivo JAR que contiene un archivo llamado META-INF/services/com.sun.tools.jconsole.JConsolePlugin. Este archivo debe contener una lista de todos los nombres de clase de plug-in calificados, uno por línea. Para cargar los nuevos plug-ins en la vista de JConsole, ejecutar JConsole desde la línea de comandos con el comando:

jconsole -pluginpath plugin_path

En este comando, plugin_path se refiere a la vía de acceso al directorio o archivo de los plug-ins de JConsole. Se pueden especificar múltiples vías de acceso.

Java SE 6 viene equipada con una muestra de plug-in de JConsole que se llama JTop. JTop muestra el uso de la CPU de las hebras que se ejecutan dentro de la aplicación actual. Para ejecutar JConsole con el JTop, ejecutar el comando:

jconsole -pluginpath JAVA_HOME/demo/management/JTop/JTop.jar

La Figura 8 muestra una instancia en JConsole con la pestaña JTop seleccionada. La columna de la izquierda muestra los nombres de todas las hebras que se están ejecutando. En cada hebra, se muestran el estado de la hebra y el uso de la CPU. Esta vista se renueva automáticamente a medida que las estadísticas cambian. El plug-in de JTop es útil para identificar hebras con un alto consumo de CPU.

Figura 8. Plug-in de JTop de JConsole.
Plug-in de JTop de JConsole.

Herramientas de supervisión y de resolución de problemas

Además de JConsole, Java SE 6 incluye el soporte para otra serie de herramientas de línea de comandos. Estas herramientas de diagnóstico se pueden adjuntar a cualquier aplicación sin necesidad de que la aplicación se inicie en un modo especial. Lo que le permiten obtener más información sobre una aplicación para determinar si se está comportando como se esperaba. Tenga en cuenta que estas herramientas se enumeran como experimentales y podrían no ser totalmente compatibles con futuros releases de Java SE.

Herramientas de supervisión

Java SE 6 incluye tres utilidades de línea de comandos, enumeradas en la Tabla 2, que son útiles para supervisar estadísticas de rendimiento de JVM:

Tabla 2. Herramientas de supervisión
HerramientaDescripción
jpsHerramienta de estado de proceso JVM
jstatHerramientas de supervisión de estadísticas de JVM
jstatdJVM jstat daemon

La utilidad jps enumera las máquinas virtuales del usuario actual en el sistema de destino. La utilidad es útil en entornos donde la VM se inicia por medio de la API JNI Invocation en lugar del iniciador Java estándar. En estos entornos, no siempre es fácil reconocer los procesos Java en la lista de procesos. La herramienta jps alivia este problema.

El siguiente ejemplo muestra el uso de la utilidad jps . Simplemente introduzca jps en la línea de comandos, y la utilidad enumera las máquinas virtuales y los ID de proceso para los cuales el usuario tiene derechos de acceso, como se muestra en el ejemplo de Listado 3:

Listado 3. Uso de la utilidad jps
$ jps
16217 MyApplication
16342 jps

La utilidad jstat utiliza la instrumentación incorporada en la JVM para proporcionar información sobre el consumo de recursos y el rendimiento de las aplicaciones que se están ejecutando. La herramienta es útil para diagnosticar problemas de rendimiento, en particular asuntos relacionados con el dimensionamiento del almacenamiento dinámico y la recogida de basura.

El daemon jstatd es una aplicación de servidor Remote Method Invocation (RMI) que supervisa la creación y terminación de las JVM y proporciona una interfaz para permitir que las herramientas de control remoto se adjunten a las JVM que se ejecutan en el host local. Por ejemplo, este daemon permite a la utilidad jps enumerar procesos en un sistema remoto.

Consulte Recursos para obtener documentación adicional y ejemplos de uso para cada una de estas herramientas.

Herramientas para la resolución de problemas

Java SE 6 también incluye una serie de herramientas para la resolución de problemas, enumeradas en la Tabla 3, que pueden ayudarle a identificar las partes de la aplicación que se están comportando de forma inesperada:

Tabla 3. Herramientas para la resolución de problemas
HerramientaDescripción
jinfoInformación de configuración
jhatNavegador de vuelco de almacenamiento dinámico
jmapMapa de memoria
jsadebugdFuncionalidad del daemon del agente de depuración
jstackRastreo de pila

La utilidad de línea de comandos jinfo recupera la información de configuración de un proceso de Java que se esté ejecutando o un volcado de caída e imprime las propiedades del sistema o los distintivos de línea de comandos que se utilizaron para iniciar la máquina virtual.

La herramienta jhat proporciona un medio conveniente para navegar por la topología del objeto en una instantánea del almacenamiento dinámico.Esta herramienta, introducida en el release Java SE 6 para sustituir Heap Analysis Tool (HAT), es útil para detectar fugas de memoria.

La utilidad de línea de comandos jmap imprime estadísticas relacionadas con la memoria de una VM en ejecución o archivo de la clase Core. La utilidad además puede usar el daemon jsadebugd para consultar un proceso o archivo de la clase Core en una máquina remota. La herramienta jmap es útil para diagnosticar el uso excesivo de los finalizadores, que puede dar lugar a un OutOfMemoryError.

El Serviceability Agent Debug Daemon (jsadebugd) se adjunta a un proceso Java o a un archivo de la clase Core y actúa como un servidor de depuración. Esta utilidad está en la actualidad únicamente disponible en Solaris OS y Linux. ®. Clientes remotos como jstack, jmap y jinfo se pueden adjuntar a este servidor por medio de Java RMI.

La utilidad de línea de comandos jstack se adjunta al proceso especificado o archivo de la clase Core e imprime el rastreo de pila de todas las hebras conectadas a la máquina virtual, incluidas las hebras Java y las hebras internas de VM, y opcionalmente las tramas de pila nativas. La utilidad además realiza detenciones de punto muerto. Puede usar el daemon jsadebugd para consultar un proceso o archivo de la clase Core en una máquina remota. La herramienta jstack es útil para diagnosticar puntos muertos.

Consulte Recursos para obtener documentación adicional y ejemplos de uso para cada una de estas herramientas.


Conclusión

La plataforma Java 6 ofrece varias mejoras en instrumentación de VM, las API de gestión y herramientas JDK para ayudarle a identificar y diagnosticar de manera eficiente los problemas de rendimiento y de memoria en las aplicaciones Java. Este artículo describe las mejoras introducidas en la infraestructura de gestión y supervisión de Java SE y toca las utilidades de diagnostico de línea de comandos disponibles para los desarrolladores.

El promedio de velocidad de las aplicaciones Java se ha incrementado con el tiempo. En la actualidad, con el release Java SE 6, el rendimiento de Java es comparable al de C o C++. En muchos casos, el código Java se ejecuta mucho más rápido. Y usted puede utilizar las herramientas aquí descritas para lograr una mejor optimización del rendimiento. Inténtelo, le garantizamos que encontrará lugares para optimizar su aplicación donde no sabía que se podía.

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=811776
ArticleTitle=Supervisar y diagnosticar el rendimiento en Java SE 6
publish-date=04302012