/head>
|
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. |
|