Seleccionar página

Hola otra vez,

Hoy estaba por aqui ojeando algunas páginas de Sun, y me he topado con una utilidad tan interesante como desconocida (al menos por mi ;P)

Se trata de que en cualquier momento, desde una shell en la que esté corriendo una aplicación java en primer plano, si se pulsa Ctrl + se obtiene el estado de los hilos de la aplicación, e información de los locks en los que se puede encontrar.

Es cierto que esta información también se puede obtener usando jconsole, pero esto es menos engorroso para echar un vistazo rápido.

Un pequeño programa que he escrito para generar un deadlock:

public class Deadlock implements Runnable {

        Thread towaitto;

        public Deadlock(Thread towaitto) {
                this.towaitto = towaitto;
        }

        public void run(){
                if(towaitto != null) {
                        try{
                                towaitto.join();
                        }catch(InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        }

        public static void main(String args[]){
                Thread t1 = new Thread(new Deadlock(Thread.currentThread()));
                t1.start();
                try{
                        t1.join();
                }catch(InterruptedException e) {
                        e.printStackTrace();
                }
        }
}

Y la salida tras pulsar Ctrl+/ :

Full thread dump Java HotSpot(TM) Client VM (1.5.0_08-b03 mixed mode, sharing):

"Thread-0" prio=1 tid=0x08183bd0 nid=0x2aba in Object.wait() [0xb1f23000..0xb1f23f60]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x889304e0> (a java.lang.Thread)
        at java.lang.Thread.join(Thread.java:1095)
        - locked <0x889304e0> (a java.lang.Thread)
        at java.lang.Thread.join(Thread.java:1148)
        at Deadlock.run(Deadlock.java:13)
        at java.lang.Thread.run(Thread.java:595)

"Low Memory Detector" daemon prio=1 tid=0x080a6bb0 nid=0x2ab8 runnable [0x00000000..0x00000000]

"CompilerThread0" daemon prio=1 tid=0x080a5608 nid=0x2ab7 waiting on condition [0x00000000..0xb234a8c8]

"Signal Dispatcher" daemon prio=1 tid=0x080a4560 nid=0x2ab6 waiting on condition [0x00000000..0x00000000]

"Finalizer" daemon prio=1 tid=0x0809cdc8 nid=0x2ab5 in Object.wait() [0xb2487000..0xb24871e0]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x889306c8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
        - locked <0x889306c8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=1 tid=0x0809c0a8 nid=0x2ab4 in Object.wait() [0xb2507000..0xb2508060]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x889305d8> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:474)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        - locked <0x889305d8> (a java.lang.ref.Reference$Lock)

"main" prio=1 tid=0x0805c9f0 nid=0x2ab2 in Object.wait() [0xbfd8c000..0xbfd8c2d8]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x889866d0> (a java.lang.Thread)
        at java.lang.Thread.join(Thread.java:1095)
        - locked <0x889866d0> (a java.lang.Thread)
        at java.lang.Thread.join(Thread.java:1148)
        at Deadlock.main(Deadlock.java:26)

"VM Thread" prio=1 tid=0x080994f0 nid=0x2ab3 runnable 

"VM Periodic Task Thread" prio=1 tid=0x080a8098 nid=0x2ab9 waiting on condition

Como se puede ver, el thread “Thread-0″ y el “main” se están esperando mutuamente.

Y esto es todo, hasta la próxima