viernes, 16 de agosto de 2013

Herramientas JAVA y JROCKIT


USO DE HERRAMIENTAS JAVA


jconsole: 

  •  jconsole JMX es una herramienta compatible con interfaz gráfica de usuario que se conecta a una JVM en ejecución, que se inicia con el agente de administración.
  • jconsole permite ver el interior de la JVM y la aplicación mientras se está ejecutando.
  • jconsole proporciona visualización en tiempo real del rendimiento de las aplicaciones y muestra su consumo de recursos.

jconsole se puede conectar a una JVM que se ejecuta en las siguientes maneras:

  • Local
- Se conecta a la JVM que se ejecuta en el sistema local utilizando RMI.

  • Remoto
- Se conecta a un agente JMX mediante un conector RMI.

  • Avanzado.
- Se conecta a un agente JMX mediante un conector no RMI (por ejemplo SNMP).

Para utilizar esta herramienta debemos primero setear variables, y aquí presento varias formas de hacerlo:
1.- La primera opción es setear variables de Weblogic con setDomainEnv.sh ejecutandolo asi (esto hacerlo preferentemente con un usuario weblogic):

# . /Middleware/Weblogic10/user_projects/domains/base_domain/bin/setDomainEnv.sh

2.- Otra forma es setear variables java con los siguientes comandos (como root o como weblogic):

# export JAVA_HOME=/home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0 (ruta de tu jdk)
# export PATH=$JAVA_HOME/bin:$PATH

3.- Para iniciar jconsole ejecutamos el siguiente comando:
# jconsole
Nos manda la siguiente ventana donde podemos observar los procesos que se estan ejecutando dentro de una JVM.

4.- Damos clic en un proceso o aplicación que tengamos en ejecución y damos en Connect.


La interfaz de jconsole costa de seis pestañas:
  1. Pestaña Overview: Resumen de la informacion sobre la JVM y los valores monitorizados.
  2. Pestaña Memory: Informacion sobre el uso de la memoria.
  3. Pestaña Threads: Informacion sobre el uso del hilo.
  4. Pestaña Classes: Informacion sobre la carga de clases.
  5. Pestaña MBeans: Informacion sobre MBeans.
  6. Pestaña VM Summary: Informacion sobre la JVM (Java Virtual Machine).

jps

  • Esta herramienta proporciona información sobre el estado de un proceso JVM.
  • En este se enumeran todas las maquinas virtuales que corren en modo de monitoreo en un equipo determinado.
  • Si jps se ejecuta sin especificar un identificador, busca maquinas virtuales instrumentadas en el host local.
  • Si jps se inicia con un identificador de anfitrion, busca la JVM en el host indicado, utilizando el protocolo y puerto especificado.
  • Esta herramienta se puede utilizar para recuperar el vmid (identificador de la maquina virtual) o el lvmid (identificador de la maquina virtual local).
jstat

  • Se trata de una herramienta de Monitoreo de Estadisticas de Java Virtual Machine.
  • Esta herramienta muestra las estadisticas de rendimiento para una JVM HotSpot.
  • Se puede conectar a una JVM local utilizando un lvmid.
  • Tambien se puede conectar a una JVM remota con un vmid.
  • Se puede recuperar el lvmid en un equipo de destino.

Podemos obtener las siguientes estadisticas JVM dinamicamente usando jstat:
  • Estadísticas Compiler.
  • Class loader statistics (estadisticas del cargador de clases)
  • Garbage collection statistics (estadisticas de recoleccion de basura).

Estadísticas de GC (Garbage Collection) incluyen:
  • Capacidad
  • Utilización.

Como podemos utilizar jstat?
Por ejemplo con el siguiente comando:
$ jstat -gc 5179 

 
Esto proporciona estadísticas sobre el comportamiento de la pila (heap) de recolección de basura.

jinfo

jinfo imprime información de la configuración Java para un proceso Java dado. Podemos visualizar todas las propiedades del sistema Java VM y banderas con esta herramienta.

  • Podemos utilizar jinfo para encontrar la siguiente información sobre una maquina virtual corriendo en forma local o remota:
  • Versión de la Maquina Virtual en ejecución.
  • Opciones del compilador que se utilizan actualmente.
  • Classpath que estamos utilizando actualmente.
  • Información de la configuración regional.
  • Opciones de linea de comandos establecidos durante el inicio de la Maquina Virtual.

Para poder utilizar jinfo en la linea de comandos nos vamos a ayudar de una de las herramientas que hemos visto anteriormente, la cual es jps; la usaremos para ver los procesos en ejecución y rescataremos de esta el pid.


 

jmap


Mapa de memoria para Java. Permite imprimir los mapas de memoria de objetos compartidos o detalles de la memoria de la pila de un proceso o archivo central o un servidor de depuración remoto.

Jmap [opcion] pid
Jmap [opcion] nucleo ejecutable
Jmap [opcion] [server-id @] a distancia-host-o-IP

Un ejemplo de como usar el jmap, igual como en el ejercicio anterior nos hacemos ayuda de jps:

[Weblogic@station8 ~]$ jps
4435 Server
4914 NodeManager
5151 Jps
4775 Server
4756 Server
[Weblogic@station8 ~]$ jmap 4914
Attaching to process ID 4914, please wait...
sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypes" in any of the known library names (libjvm.so, libjvm_g.so, gamma_g)
at sun.jvm.hotspot.HotSpotTypeDataBase.lookupInProcess(HotSpotTypeDataBase.java:585)
at sun.jvm.hotspot.HotSpotTypeDataBase.readVMTypes(HotSpotTypeDataBase.java:150)
at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:85)
at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:569)
at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:493)
at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:331)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)
at sun.jvm.hotspot.tools.PMap.main(PMap.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.tools.jmap.JMap.runTool(JMap.java:197)
at sun.tools.jmap.JMap.main(JMap.java:128)
Debugger attached successfully.
0x0000000000400000 263K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/bin/java
0x0000003b7ca00000 153K /lib64/ld-2.12.so
0x0000003b7ce00000 22K /lib64/libdl-2.12.so
0x0000003b7d200000 1877K /lib64/libc-2.12.so
0x0000003b7d600000 142K /lib64/libpthread-2.12.so
0x0000003b7de00000 584K /lib64/libm-2.12.so
0x0000003b8d200000 113K /lib64/libnsl-2.12.so
0x0000003f3ce00000 45K /lib64/librt-2.12.so
0x00007fa9e1886000 13K /Middleware/Weblogic10/wlserver_10.3/server/native/linux/x86_64/libnodemanager.so
0x00007fa9e1a89000 236K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/liborii.so
0x00007fa9e1d10000 43K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/libnio.so
0x00007fa9e1e18000 111K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/libnet.so
0x00007faa3c269000 90K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/libzip.so
0x00007faa3c5cd000 54K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/native_threads/libhpi.so
0x00007faa3c758000 229K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/libjava.so
0x00007faa3c887000 64K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/libverify.so
0x00007faa3d339000 274K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/libjfr.so
0x00007faa3d549000 64K /lib64/libnss_files-2.12.so
0x00007faa3e258000 228K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/libjrutil.so
0x00007faa3e465000 485K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/libjrosal.so
0x00007faa3e687000 23187K /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/jre/lib/amd64/jrockit/libjvm.so
[Weblogic@station8 ~]$

jstack

SEGUIMIENTO DE PILA: Se utiliza para imprimir un seguimiento de pila de todos los procesos actualmente en ejecución en una maquina virtual.
jstack es diferente del proceso de volcado de hilo normal en las siguientes maneras:
  • imprime pila de subprocesos de VM en ejecución remota.
  • imprime hilos de pila de archivos central
  • imprime pila de subprocesos en la salida estándar en el que se ejecuta este comando.

Opciones de jstack:

-F Forzar un volcado de la pila cuando “jstack -l pid” no responde.
-L Lista larga. Imprime información adicional sobre los bloqueos.
-M Imprime en modo mixto (tanto Java y nativos C / C++) seguimientos de pila.
-H Imprime un mensaje de ayuda.
-Help

jstack [opción] pid
jstack [opción] nucleo ejecutable
jstack [opción] [server-id @] a distancia-host-o-IP

Aquí tenemos un ejemplo de como utilizar la herramienta jstack:

$ jstack -l 4914

===== FULL THREAD DUMP ===============
Wed Aug 14 16:50:57 2013
Oracle JRockit(R) R28.2.7-7-155314-1.6.0_45-20130329-0641-linux-x86_64

"Main Thread" id=1 idx=0x4 tid=4915 prio=5 alive, in native
at __accept_nocancel+34(:0)@0x3b7d60e84b
at java/net/PlainSocketImpl.socketAccept(Ljava/net/SocketImpl;)V(Native Method)
at java/net/PlainSocketImpl.accept(PlainSocketImpl.java:408)
^-- Holding lock: java/net/SocksSocketImpl@0xf001dca8[biased lock]
at java/net/ServerSocket.implAccept(ServerSocket.java:462)
at javax/net/ssl/impl/SSLServerSocketImpl.accept()Ljava/net/Socket;(Unknown Source)
at weblogic/nodemanager/server/SSLListener.run(SSLListener.java:98)
at weblogic/nodemanager/server/NMServer.start(NMServer.java:207)
at weblogic/nodemanager/server/NMServer.main(NMServer.java:382)
at weblogic/NodeManager.main(NodeManager.java:31)
at jrockit/vm/RNI.c2java(JJJJJ)V(Native Method)
-- end of trace
.
.
.

 
Ejemplo N° 2. utilizando jstack con la opcion -m seguido del pid del proceso:

[Weblogic@station8 ~]$ jstack -m 4914
Attaching to process ID 4914, please wait...
sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypes" in any of the known library names (libjvm.so, libjvm_g.so, gamma_g)
at sun.jvm.hotspot.HotSpotTypeDataBase.lookupInProcess(HotSpotTypeDataBase.java:585)
at sun.jvm.hotspot.HotSpotTypeDataBase.readVMTypes(HotSpotTypeDataBase.java:150)
at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:85)
at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:569)
at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:493)
at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:331)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:86)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.tools.jstack.JStack.runJStackTool(JStack.java:136)
at sun.tools.jstack.JStack.main(JStack.java:102)
Debugger attached successfully.
jstack requires a java VM process/core!
[Weblogic@station8 ~]$

Ejemplo 3. Usando la ayuda de la herramienta jstack:

[Weblogic@station8 ~]$ jstack -h
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)

Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message

JROCKIT Y MISSION CONTROL


  • WebLogic JRockit JVM está diseñado para el lado del servidor de aplicaciones.
  • Emplea optimización adaptativa para mejorar significativamente el rendimiento en tiempo de ejecución.
  • Tiene la recolección de basura adaptativa y la gestión de pilas.
  • Ofrece soporte completo para JRockit de 32 y 64 bits de Intel en EM64T/AMD64 y compatibles.
  • JRockit también es compatible con la arquitectura de Solaris / SPARC.
  • Ofrece soporte para grandes pilas en las plataformas de 64 bits.
  • La suite de herramientas para JRockit Mission Control ofrece mejor manejo, tuning y solución de problemas.


Generational Heap: Jrockit

En los dos modelos generacionales, una pila esta dividida en dos generaciones:
- Generacion Joven (Nursery)
- Generacion Vieja
En un modulo de solo un espacio, todos los objetos se asignan en un unico espacio de la pila.

JRockit Mission Control

JRockit Mission Control proporciona un conjunto de herramientas que se puede utilizar para recopilar y analizar la información del tiempo de ejecución de JRockit de diferentes maneras.
El objetivo principal de JRockit Mission Control es hacer la instrumentación necesaria con el menor impacto posible en el sistema.
JRockit con JRockit Mission Control.
Este es un grupo de herramientas de gestión y monitoreo:
  • JRockit Management Console: herramienta de control compatible con JMX.
  • JRockit Runtime Analyzer: Permite Registros y ayuda a analizar la JVM y aplicación en ejecución.
  • JRockit Memory Leak Detector (Detector de fugas de memoria): Detecta y encuentra la causa de las pérdidas de memoria.

JRockit Mission Control: Architecture 

La imagen muestra las interfaces de la Consola de administración de JRockit con el agente JMX. El Rockit Runtime Analyzer es capaz de analizar y mostrar los resultados de las grabaciones JRA. Las interfaces detector de fugas de memoria (Memory Leak Detector) con el servidor de pérdida de memoria.

JRockit Management Console

La Consola de administración de JRockit es una consola basada en JMX utilizado para gestionar y supervisar la JRockit JVM.
El JRockit Management Console se puede utilizar para monitorear y administrar múltiples instancias JRockit.
Captura y presenta datos en tiempo real sobre pausas Garbage Collention (GC), uso de memoria y CPU, así como información de cualquier JMX MBean desplegado en el servidor MBean interno JVM.

Para usar la herramienta de JRockit Mission Control ejecutamos el siguiente comando:

# java -jar /home/Weblogic/jrockit-jdk1.6.0_45-R28.2.7-4.1.0/missioncontrol/mc.jar

el cual nos mandara la siguiente ventana:

Le damos clic en la opcion: The Management Console y nos muestra la siguiente ventana:

Monitoreo de procesos Java con Aplicaciones de Terceros.


Monitoreando aplicaciones JAVA con jAMON y VisualVM.

Existen varias alternativas al momento de monitorear una aplicación java dependiendo de lo que se necesita monitorear, además hay que tener en cuenta que algunas soluciones son más intrusivas que otras y esto en algunos casos puede resultar interesante si es que se necesita mas precisión. En particular, si interesa monitorear el  tiempo de respuesta en todos los puntos de entrada de una aplicación mas una análisis del uso de los recursos, les presento dos soluciones complementarias:

jAMON

jAMON es una solución libre (licencia BSD) que nos provee varias alternativas al momento de monitorear una aplicación pero de forma intrusiva, que quiero decir con “intrusiva”? Que es necesario integrarlo a la aplicación de alguna manera y esto va a requerir una modificación o extensión (sería lo adecuado) del sistema a monitorear. De mas está decir que la manera de agregar este tipo de comportamiento se puede (y debe) hacerse sin alterar nada de lo que originalmente hace el sistema .. y si si, tal como están pensando .. esa manera es ASPECTOS. No es que si no utilizamos aspectos no podemos integrarlo.. pero difinitivamente de esta manera nos provee una separación clara de responsabilidad con la opción de habilitar o deshabilitar el monitor sin tener que tocar una linea de código del sistema a monitorear.
Esta librería es por demas simple y por cada aspecto que queremos monitorear podemos visualizar el tiempo medio de respuesta, la desviación estandard, mínimo tiempo de respuesta, máximo tiempo de respuesta, timestamp del primer  y último estimulo, etc etc. Esta información se puede visualizar ya sea con unas páginas jsp que nos prevee jAMON las cuales deben agregarse a la webapp (en el caso que sea una aplicación web) o bien utilizar un appender de log4j para persistirlo a disco.

 Visual VM

Con respecto a VisualVM, es una aplicación libre muy liviana orientada a plugins que fue liberada a partir de la jdk 1.5 que reune varios de los utilitarios para monitoreo no intrusivo que proveía Sun por linea de comando como  jprof y jmap pero mucho mejor presentados además de una serie de nuevas features que lo hacen una solución liviana para monitorear aplicaciones (no es profiling aunque provee algunos plugins para poder hacerlo). VisualVM puede correr como un binario ajeno a la aplicación o también como un plugin para Eclipse
En particular hay cuatro cosas muy interesantes de esta herramienta:
  1. Monitoreo de recursos como heap, permgem, CPU usage , theads, comportamiento de Garbage Collector, etc etc
  2. Posibilidad de monitorear procesos JAVA de manera remota o local
  3. Profiler (plugin) donde podemos ver la cantidad de instancias por clase (muy bueno para detectar problemas sin la necesidad de usar un profiler de los típicos pesados como NetBeans o Eclipse Profiler Plugin)
  4. Monitor de Mbeans (podríamos publicar con Spring los Mbeans de Hibernate, Spring,Dozer,wicket, etc y monitorearlos desde VisualVM)
Ejemplo de Reporte de uso de memoria :
 
Actividad de los threads:

 
Cantidad de instancias por clase, uso de momoria, etc.





REFERENCIAS:


No hay comentarios:

Publicar un comentario en la entrada