< /head>
Tutorial de Java

Consola Java

Anterior | Siguiente

Actualmente ya se dispone de entornos de desarrollo Java que permiten una depuración mucho más amigable que al que representa el jdb. Pero sigue habiendo ocasiones en que no tiene sentido su uso en casos triviales, que en principio se usan para comprobaciones. Por ejemplo, cuando se escriben programas gráficos, se debería utilizar la salida por consola para saber si los parámetros tienen sentido, o si se ha llegado alguna vez al método update().

Las dos salidas de estos mensajes de depuración son: la consola y la línea de estado del navegador, o visualizador. Para imprimir mensajes en la consola se utilizan llamadas al método println() de la clase System, que resultará muy conocido al lector.

    System.out.println( "Hola, que tal?" );

El uso de la consola es bueno porque está habitualmente oculta al usuario, y los navegadores permiten su visualización o no.

El método showStatus() presenta cadenas en la línea de estado del appletviewer o del navegador que se esté utilizando. El problema es que esta línea es muy sociable, y no hay forma de tenerla en uso exclusivo, sino que acepta mensajes de otros applets o de otros elementos de la página html, de forma que una vez machacado el mensaje, no hay forma de volver a verlo. Es decir, que no se puede confiar en ver el mensaje.

    showStatus( "Hola, que tal?" );

Cuando se utilice la línea de estado, hay que recordar limpiarla cuando se termine la ejecución del applet, porque quedaría poco profesional dejar mensajes escritos que no vienen a cuento. Se consigue con:

    showStatus( "" );

La consola Java de los navegadores se puede utilizar más eficientemente o, mejor dicho, se le puede sacar más partido si se conocen los entresijos, o algunas de sus características, que no son obvias en un uso normal.

Si se está utilizando el navegador Netscape, por ejemplo, no es obvio a los usuarios que la consola Java acepte comandos de teclado. Sin embargo, es así; esta consola Java acepta comandos de teclado: desde la tela 0 a la 9, se fija el nivel de depuración que presentará la Máquina Virtual Java; además, hay tres comandos adicionales que se consiguen con las teclas D, F, y G, ya disponibles en la versión 3.0 del Netscape Navigator, a los cuales se han añadido unos cuantos comandos más en el Nescape Communicator 4.0, incluido un comando de ayuda que describe las teclas que se pueden utilizar como comandos. Si se pulsa la tecla "h", se presenta información de los nuevos comandos.

Estos comandos no están documentados en los manuales de Netscape, así que lo que a continuación podrá leer el lector es fruto de la experimentación.

La tecla "C" limpia todos los mensajes que haya en la cosola.

La tecla "D" hace que en la consola Java aparezca información de los applets que ha cargado la Máquina Virtual Java en la actual sesión de Netscape. Si se lanzan varias copias del navegador al mismo tiempo, todas comparten la misma consola Java.

La tecla "F" hace que se ejecute la cláusula Finalize, pero no hay liberación de memoria. Al menos esto es lo que parece que sucede, y tiene cierto sentido al existir una tecla para la acción contraria.

La tecla "G" hace que se ejecute el reciclador de memoria, hace una llamada al método Runtime.gc(). Si se juega un poco con este comando, se observa que hay que hacer varias llamadas para que se libere efectivamente la memoria. Esto tiene sentido, ya que habrá objetos que estén enlazados a otros objetos. Si el reciclador sólo libera objetos de la última rama del árbol jerárquico, la liberación completa se producirá en varios saltos; es decir, el reciclador no consume mucho tiempo en cada ejecución, sino que lo que hace es hacer una pocas cosas en cada ejecución, devolviendo rápidamente el control a la CPU, en espera de que ésta se encuentre libre de nuevo.

La tecla "M" presenta el uso de la memoria, tanto en cantidad como en tanto por ciento.

Cuando se presenta el mensaje de Out of Memory , hay varias teclas que permiten saber qué es lo que ha pasado y seguir los pasos de las últimas acciones que han llevado a esa conclusión. Algunas de estas teclas y sus acciones son las que se indican a continuación.

La tecla "S" vuelca el contenido de la memoria al fichero "memory.out", aunque hay que ser bastante experto para poder entender lo que refleja ese fichero. Un ejemplo de volcado sería el que se reproduce a continuación.

Memory Summary on Sun Apr 05 13:50:05 1998

End of heap
   Count     Total Size   Avg Size      Flags   Class

     301          39816        132   -RIV-X--   java/lang/Class
       5            356         71   -RIV-XS-   java/lang/Thread
       3            156         52   -RIV-X--   java/lang/ThreadGroup
    1800         167672         93   -RIV----   [C
    1730          52060         30   -RIV-XS-   java/lang/String
     124           3760         30   -RIV----   java/awt/Rectangle
   .
   .
   .
       1             40         40   --I-----   [Ljava/lang/Class;
       4             92         23   -RIV----   java/lang/ClassNotFoundException
       1             24         24   -RIV--S-   java/io/File

    6221         436940         70              Totals

L=Locked, R=Resolved, I=Init, V=Verif, P=Prim, X=Sticky, S=Statics, F=Finalizer

================================================================================

La tecla "T" vuelca al fichero "memory.out" información de los hilos de ejecución (threads), al estilo de lo se reproduce a continuación.

Thread Summary on Sun Apr 05 13:55:57 1998

--Thread---------------ID-------Pri-State--------------------------------------
Current:
  "AWT-Callback"             b4  15 running
RunQ:
  finalizer                  9c  11 condwait inf [Monitor gc-lock 88d740]
  mocha-thread               af  13 condwait inf [Monitor lm-queue-monitor 82d770]
  "ScreenUpdater"            b6  14 condwait inf [Monitor mc-              812e50]
  mozilla                    ba  15 running
  "AWT-Windows"              7a  15 running
  "AWT-Callback"             b4  15 running
  "Applet Thread Killer"       aa  15 condwait inf [Monitor mc-            812580]
  NSPR:WinSockMessageThread       be  16 running
-------------------------------------------------------------------------------

--Monitors---------------------------------------------------------------------
-------------------------------------------------------------------------------

--Monitor-Cache----------------------------------------------------------------
  4004c978 -> [Monitor mc-                  812580]
  40020460 -> [Monitor mc-                  812e50]
-------------------------------------------------------------------------------

================================================================================

La tecla "X" vuelca el contenido de la memoria al fichero, indicando en que zona se encuentra cada uno de los objetos y la memoria que están ocupando, presentando la información sucinta o detallada; pero, ya la información normal es exhaustiva, así que la detallada, se vuelve infumable para alguien que de verdad no tenga problemas irresolubles por otro lado.

Cada vez que se pulsan las teclas que se han citado, aparece un mensaje en la consola Java. La siguiente reproducción de mensajes que aparecen en la consola, corresponde la salida que se produce cuando se carga un applet y se pulsa la tecla "9" para fijar el nivel de depuración al máximo de información posible.

Netscape Communications Corporation -- Java 1.1.2
Type '?' for options.
Symantec Java! ByteCode Compiler Version 210.065
Copyright (C) 1996-97 Symantec Corporation
# Applet debug level set to 9
# initApplet: contextID=266 appletID=10101200 parentContext=8827552 frameContext=8827552
# New applet context: file:///E|/USO/CurJava/JavaTut/Aplica/calcula.html, contextID=266
# Initializing applet: Calculadora.class, appletID=10101200, contextID=266
#   docURL=file:///E|/USO/CurJava/JavaTut/Aplica/calcula.html reloadClasses=false
#     total applets=1
#     New applet: 10101200 at file:/E|/USO/CurJava/JavaTut/Fuentes/Aplica/Clases/ width=290 
       height=178 hspace=0 vspace=0 align=baseline 
       codebase=file:/E|/USO/CurJava/JavaTut/Fuentes/Aplica/Clases/ code=Calculadora.class 
#   new class loader netscape.applet.AppletClassLoader@800c51e
#    context = netscape.applet.MozillaAppletContext@800b88f
#    codebase = file:/E|/USO/CurJava/JavaTut/Fuentes/Aplica/Clases/
#    archive = null
# startApplet: contextID=266 appletID=10101200 newFrameMWContext=8827552
# Loading class Calculadora
# Starting applet: Calculadora, appletID=10101200, contextID=266
# Fetching file:/E|/USO/CurJava/JavaTut/Fuentes/Aplica/Clases/Calculadora.class
# Loading class BotonCalculadora
# Fetching file:/E|/USO/CurJava/JavaTut/Fuentes/Aplica/Clases/BotonCalculadora.class
# Applet Calculadora loaded
# Applet Calculadora initialized
# Applet Calculadora running
# stopApplet: contextID=266 appletID=10101200 parentMWContext=8827552
# Stopping applet: Calculadora, appletID=10101200, contextID=266
# Applet Calculadora stopped

Aquí se puede observar que aparecen en la lista todas las clases que son instanciadas. Luego se puede utilizar esta información para construir ficheros comprimidos con las clases que se utiliza exclusivamente, con objeto de obtener ficheros del mínimo tamaño posible. Esta lista de clases utilizadas es muy fácil de construir, ya que basta ejecutar el applet y seleccionar todos los caminos posibles del código.

La tecla "D" no ayuda a incrementar el rendimiento, pero proporciona información útil a la hora de ver los parámetros del fichero html.

Navegador

Home | Anterior | Siguiente | Indice | Correo