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.
- 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:
- Pestaña Overview: Resumen de la informacion sobre la JVM y los valores monitorizados.
- Pestaña Memory: Informacion sobre el uso de la memoria.
- Pestaña Threads: Informacion sobre el uso del hilo.
- Pestaña Classes: Informacion sobre la carga de clases.
- Pestaña MBeans: Informacion sobre MBeans.
- 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.
- Monitoreo de recursos como heap, permgem, CPU usage , theads, comportamiento de Garbage Collector, etc etc
- Posibilidad de monitorear procesos JAVA de manera remota o local
- 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)
- Monitor de Mbeans (podríamos publicar con Spring los Mbeans
de Hibernate, Spring,Dozer,wicket, etc y monitorearlos desde
VisualVM)
Actividad
de los threads:
Cantidad
de instancias por clase, uso de momoria, etc.
REFERENCIAS:
No hay comentarios:
Publicar un comentario