2011-08-17 11 views
31

En el perfil de Java, parece que todos los caminos (libres) actuales conducen al perfilador de 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 parece ser la única forma en que lo usa en un proceso local. Quiero poder iniciar mi programa en el generador de perfiles y rastrear su ejecución completa .Perfil Ejecución de programa de Java completo en VisualVM

He intentado utilizar la opción -Xrunjdwp descrita en how to profile application startup with visualvm, pero entre los dos métodos de transporte (memoria compartida y servidor), ninguno me es ú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 finalice la lectura, y no le permite comenzar a perfilar hasta que la ejecución esté en marcha. También he intentado buscar en the Eclipse plugin pero el sitio web está lleno de enlaces muertos y el iniciador simplemente se bloquea con un NullPointerException cuando intento usarlo (esto puede no ser más preciso).

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.

+0

Respondiendo a la pregunta a la que se ha referido, ¿has intentado 'suspend = y', en lugar de' suspend = n' publicado? No necesitarías leer de 'System.in' si ese fuera el caso. –

+0

Sí, pero no importa. No veo ninguna forma de conectar el programa a VisualVM, independientemente del parámetro 'suspend '. – kbolino

+0

Debe haber un "correctamente" allí en alguna parte. Por supuesto, VisualVM puede ver el proceso. El problema es que no puede perfilarlo. – kbolino

Respuesta

19

Considere usar HPROF y abra el archivo de datos con una herramienta como HPjmeter - o simplemente leyendo 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, estadísticas asignación del montón, y monitorear los perfiles de contención. 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 .

+0

¡Gracias, eso es exactamente lo que estaba buscando! – kbolino

+0

En cualquier momento, me alegro de ayudar. –

11

La mejor manera de resolver este problema sin modificar su aplicación, es no usar VisualVM en absoluto. En cuanto a otras opciones gratuitas, puede usar Eclipse TPTP o Netbeans profiler, 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 muy posible hacerlo, utilizando el complemento 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 binario 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).

Eclipse VisualVM plugin

También tendrá que configurar la aplicación para comenzar con el lanzador VisualVM, en lugar de la JDT lanzador por defecto.

Todas las aplicaciones se inician desde Eclipse, ahora 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 frase 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.

+0

No sé cuál es el problema, ya que ni siquiera me da un seguimiento de pila para el NPE. En cualquier caso, estaba buscando una solución más automatizada, y desafortunadamente VisualVM no parece estar a la altura de la tarea. – kbolino

+1

Si no se configura el complemento (correctamente) se generará una 'NullPointerException' reproducible. En mi sistema, con 'JDK Home' configurado y 'VisualVM Executable' vacío, cualquier configuración de ejecución que utilice el iniciador de VisualVm fallará. –

3

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, al insertar System.in o Thread.sleep() se pausará el inicio y se permitirá que VisualVM se conecte a su aplicación. Asegúrese de leer Profiling with VisualVM 1 y Profiling with VisualVM 2 para comprender mejor la configuración del perfilador. Tenga en cuenta también que, en lugar de crear perfiles, puede usar la pestaña 'Muestra' en VisualVM, que es más adecuada para perfilar toda la ejecución del programa Java. Como se mencionó anteriormente, también puede usar NetBeans Profiler, que soporta directamente el perfil del inicio de la aplicación.

3

Esto ahora es posible con el startup profiler plugin a VisualVM.

+1

Startup Profiler dice que se ejecuta con VisualVM 1.3.6 y no es cargable con VisualVM 1.8.0. Entonces, al menos con las versiones actuales, esto no funciona. –

Cuestiones relacionadas