jinfo
root@opensolaris:~# dtrace -ln 'hotspot*:::' | more ID PROVIDER MODULE FUNCTION NAME 4762 hotspot2688 libjvm.so __1l[...]s_b_v_ class-loaded 4763 hotspot2688 libjvm.so __1c[...]anceKlass__v_ class-unloaded 4764 hotspot2688 libjvm.so __1cH[...]dbFpost_c compiled-method-load [...]
Este provider nos proporciona probes para comprobar muchos aspectos de la máquina virtual java. Podéis encontrar una descripción completa de todas ellas en la documentación de sun. A grandes rasgos podremos tracear objetos, métodos, clases, monitores y la actividad del Garbage Collector.root@opensolaris:~# ./garbage-colector.d 2688 3 value ------------- Distribution ------------- count 1048576 | 0 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 4194304 | 0
En este ejemplo podemos ver que se ha ejecutado tres veces y hs tardado 209152 nanosegundos, a modo de curiosidad también nos indica que el GC es el thread 3 del proceso. Este otro script es similar al anterior pero, simplificando un poco, tracea los Pararel Garbage Colectors responsables de la gestión de las distintas generaciones de memoria por separado.root@opensolaris:~# ./garbage-colector-pool.d 2688 Code Cache value ------------- Distribution ------------- count 1048576 | 0 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 4194304 | 0 Eden Space value ------------- Distribution ------------- count 2097152 | 0 4194304 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 8388608 | 0 Survivor Space value ------------- Distribution ------------- count 2097152 | 0 4194304 |@@@@@@@@@@ 1 8388608 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 16777216 | 0 Perm Gen value ------------- Distribution ------------- count 4194304 | 0 8388608 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 16777216 | 0 Tenured Gen value ------------- Distribution ------------- count 4194304 | 0 8388608 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 16777216 | 0
La información es parecida al anterior salvo que está dividida por cada una de los Pararel Garbage Collector, Tenured, Perm, Survivor, Eden y Code. Objetos Para tracear los objetos podemos usar unos simples one-liners que nos proporcionarán información bastante interesante, veamos unos ejemplos.root@opensolaris:~# ps -ef | grep java root 2688 2680 0 jul 01 console 1236:26 java -Dprogram.name=run.sh -server -XX:+ExtendedDTraceProbes -Xms128m -Xmx512m ############ thread y objeto allocado dtrace -qn 'hotspot2688:::object-alloc { printf("thread %d new %s \n",arg0, stringof(copyin(arg1,arg2))); }' stringof(copyin(arg1,arg2))); }' thread 23 new [Ljava/lang/String; thread 23 new java/io/FileString; thread 23 new java/lang/StringBuffer thread 23 new [C thread 23 new [C thread 23 new [C thread 23 new java/lang/String [...] ############ Tamaño reservado por objetos dtrace -qn 'hotspot2688:::object-alloc { @[stringof(copyin(arg1,arg2))] = sum(arg3); }' rjuna/ats/arjuna/coordinator/CheckedActionore/AtomicActionmple 8 com/arjuna/ats/arjuna/[...]/AtomicActionmpleonEventListener$TransactionSynchronization 8 java/lang/Objectnalizerommon/[...]/arjunacore/AtomicActionmple 8 java/lang/Objectnalizerommon/[...]AtomicActionmpleonEventListener$TransactionSynchronization 8 [...] [Cva/lang/StringBufferoggingEventctQueuedSynchronizer$Node 15528 ############ Numero de veces que se ha reservado un objeto dtrace -qn 'hotspot2688:::object-alloc { @[stringof(copyin(arg1,arg2))] = quantize(arg0); }' java/lang/Stringp$Entrybean/DescriptorSupportteInforployedURL value ------------- Distribution ------------- count 4 | 0 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 164 16 | 0 [Cva/lang/StringBuilderbean/DescriptorSupportteInforployedURL value ------------- Distribution ------------- count 4 | 0 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 205 16 | 0 [Cva/lang/StringBuffer value ------------- Distribution ------------- count 32 | 0 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 29 128 | 0 [...]
Monitores Como antes os comentaba, los monitores de java son usados por sincronizar el acceso a los recursos, si un monitor está ocupado, el thread pretendiente debe esperar que se libere, con este script podremos ver que threads se quedan esperando en monitores y durante cuanto tiempo.root@opensolaris:~# ./monitor-wait.d 2688 dtrace: script './monitor-wait.d' matched 2 probes ^C 69 value ------------- Distribution ------------- count 8388608 | 0 16777216 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 3554432 | 0
Métodos En este primer ejemplo contamos el número de veces que se ejecuta cada método.
root@opensolaris:~# ./method.d
Tracing... Hit Ctrl-C to end.
^C
EDU/oswego/cs/dl/util/concurrent/ConcurrentHashMap.put 1
[...]
java/lang/System.currentTimeMillis 209
java/lang/Object.
java/util/PriorityQueue offer value ------------- Distribution ------------- count 32768 | 0 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 131072 | 0 java/util/PriorityQueue poll value ------------- Distribution ------------- count 32768 | 0 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 131072 | 0 [...] java/lang/Object wait value ------------- Distribution ------------- count 268435456 | 0 536870912 |@@@@@@@@@@@@ 5 1073741824 | 0 2147483648 | 0 4294967296 | 0 8589934592 | 0 17179869184 | 0 34359738368 | 0 68719476736 | 0 137438953472 | 0 274877906944 | 0 549755813888 | 0 1099511627776 | 0 2199023255552 | 0 4398046511104 | 0 8796093022208 | 0 17592186044416 | 0 35184372088832 | 0 70368744177664 | 0 140737488355328 | 0 281474976710656 | 0 562949953421312 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 12 1125899906842624 | 0 < /p>