libro - Perfil completo Ejecución del programa Java en VisualVM
libro de programacion en java netbeans pdf (4)
En el perfil de Java, parece que todos los caminos (libres) hoy en día conducen al perfilador VisualVM incluido con JDK6. Parece un buen programa, y todos pregonan cómo puede "adjuntarlo a un proceso en ejecución" como una característica principal. El problema es que esa parece ser la única forma de usarlo en un proceso local. Quiero poder iniciar mi programa en el generador de perfiles y hacer un seguimiento de su ejecución completa .
He intentado usar la opción -Xrunjdwp
descrita en cómo perfilar el inicio de la aplicación con visualvm , pero entre los dos métodos de transporte (memoria compartida y servidor), ninguno de los dos me resulta útil. VisualVM no parece tener ninguna integración con el primero, y VisualVM se niega a conectarse a localhost
o 127.0.0.1
, por lo que este último tampoco es bueno. También traté de insertar una lectura simple de System.in
en mi programa para insertar una pausa en ejecución, pero en ese caso VisualVM bloquea hasta que la lectura finalice, y no le permite comenzar a perfilar hasta que la ejecución esté en marcha. También he intentado buscar en el plugin de Eclipse, pero el sitio web está lleno de enlaces muertos y el iniciador solo se bloquea con una (puede que ya no sea preciso). NullPointerException
cuando intento usarlo
Viniendo de C, esto no me parece una tarea particularmente difícil. ¿Me estoy perdiendo algo o es realmente una solicitud imposible? Estoy abierto a todo tipo de sugerencias, incluido el uso de un perfilador diferente (también gratuito), y no soy contrario a la línea de comandos.
Considere usar HPROF y abra el archivo de datos con una herramienta como HPjmeter , o simplemente lea el archivo de texto resultante en su editor favorito.
Command used: javac -J-agentlib:hprof=heap=sites Hello.java
SITES BEGIN (ordered by live bytes) Fri Oct 22 11:52:24 2004
percent live alloc''ed stack class rank self accum bytes objs bytes objs trace name
1 44.73% 44.73% 1161280 14516 1161280 14516 302032 java.util.zip.ZipEntry
2 8.95% 53.67% 232256 14516 232256 14516 302033 com.sun.tools.javac.util.List
3 5.06% 58.74% 131504 2 131504 2 301029 com.sun.tools.javac.util.Name[]
4 5.05% 63.79% 131088 1 131088 1 301030 byte[]
5 5.05% 68.84% 131072 1 131072 1 301710 byte[]
HPROF es capaz de presentar el uso de CPU, las estadísticas de asignación de pila y los perfiles de contención del monitor. Además, también puede informar volcados de almacenamiento dinámico completos y estados de todos los monitores y subprocesos en la máquina virtual Java.
El consejo con -Xrunjdwp
es incorrecto. Simplemente habilita el depurador y con suspend=y
espera que el depurador se adjunte. Como VisualVM no es un depurador, no lo ayuda. Sin embargo, la inserción de System.in
o Thread.sleep()
detendrá el inicio y permite que VisualVM se conecte a su aplicación. Asegúrese de leer la creación de perfiles con VisualVM 1 y la creación de perfiles con VisualVM 2 para comprender mejor la configuración del generador de perfiles. Tenga en cuenta también que en lugar de crear perfiles, puede usar la pestaña ''Sampler'' en VisualVM, que es más adecuada para perfilar la ejecución completa del programa Java. Como se mencionó anteriormente, también puede usar NetBeans Profiler, que soporta directamente el perfil del inicio de la aplicación.
Esto ahora es posible con el plugin de inicio de perfiles para VisualVM.
La mejor forma de resolver este problema sin modificar su aplicación es no usar VisualVM en absoluto. En lo que respecta a otras opciones gratuitas, puede usar Eclipse TPTP o el generador de perfiles de Netbeans , o lo que venga con su IDE.
Si puede modificar su aplicación, suspender su estado mientras configura el generador de perfiles en VisualVM, es bastante posible hacerlo, utilizando el plugin de VisualVM Eclipse. No estoy seguro de por qué está recibiendo NullPointerException, ya que parece funcionar en mi estación de trabajo. Deberá configurar el complemento proporcionando la ruta al jvisualvm
y la ruta del JDK; esto se hace visitando el cuadro de diálogo de configuración de VisualVM en Windows -> Preferencias -> Ejecutar / Depurar -> Ejecutando -> Configuración de VisualVM (como se muestra en la siguiente captura de pantalla).
También deberá configurar su aplicación para que comience con el iniciador de VisualVM, en lugar del iniciador de JDT predeterminado.
Todos los inicios de aplicaciones de Eclipse darán como resultado que VisualVM rastree automáticamente la nueva JVM local, siempre que VisualVM ya se esté ejecutando. Si no tiene VisualVM en ejecución, el complemento abrirá VisualVM, pero también continuará ejecutando la aplicación.
A partir de la oración anterior, es evidente que detener la aplicación en el método main()
antes de realizar cualquier procesamiento es bastante útil. Pero esa no es la razón principal para suspender la aplicación. Aparentemente, VisualVM o su plugin Eclipse no permite iniciar automáticamente la CPU o los perfiladores de memoria. Esto significaría que estos perfiladores tendrían que iniciarse manualmente, por lo que es necesario suspender la aplicación.
Además, vale la pena señalar que agregar los indicadores: -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y
al inicio de JVM no le ayudará en el caso de VisualVM, suspender la aplicación y configurar los perfiladores. Las banderas están destinadas a ayudarte en el caso de los perfiles que pueden conectarse al puerto abierto de la JVM, utilizando el protocolo JDWP. VisualVM no utiliza este protocolo y, por lo tanto, tendría que conectarse a la aplicación utilizando JDB o un depurador remoto; pero eso no resolvería el problema asociado con la configuración del perfilador, ya que VisualVM (al menos a partir de la actualización 26 de Java 6) no permite configurar los perfiladores en un proceso suspendido, ya que simplemente no muestra la pestaña Perfilador.