2011-07-27 10 views
39

Me perfil ejecutar aplicaciones Java a menudo con VisualVM pero necesita X para ejecutarse en la máquinaperfilar una aplicación Java que se ejecuta en la línea de comandos

Sé que puedo conectar a través del puerto de gestión, sino que será una perfiles muestreados en línea que es no es suficiente para mí.

Así que estoy buscando una solución con la que pueda perfilar el uso de la CPU de los métodos de una aplicación Java en ejecución desde la línea de comandos. Es suficiente para mí recopilar datos en el servidor y luego los datos recopilados se pueden analizar en una máquina diferente.

Actualización:

Parece que necesito para ser más específico. Quiero perfilar una aplicación Java en ejecución desde la línea de comandos, no quiero detenerla y volver a ejecutarla.

+2

¿Se puede recoger muestras de 10 o 20 con la pila * * jstack? Entonces, si * Foo * es un método, su uso general del tiempo es la fracción de las muestras que lo contienen. Su uso de CPU es la fracción de aquellas muestras que no terminan en E/S o una llamada al sistema. Su "tiempo propio" es la fracción de muestras en la que él mismo es el término. –

+0

que sería lo mismo que el perfil fuera de línea VisualVM, no lo será? –

+1

[Verifique el documento.] (Http://visualvm.java.net/profiler.html) No le indica, por línea (no función) el porcentaje de tiempo de inclusión (no exclusivo) de que es responsable la línea, y tiempo total (no solo CPU). Sufre de [estos problemas] (http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343). El muestreo de pila no es bonito, pero encuentra los problemas de rendimiento muy rápidamente. Otras herramientas son bonitas, y te dan muchos números para acertar, pero no te llevan directamente al problema, sea lo que sea. –

Respuesta

22

La aplicación jvmtop es una herramienta conveniente para crear perfiles desde la línea de comandos. No es necesario detener el jvm. Uso:

jvmtop.sh --profile <PID> 

dará un resultado como éste, que será la actualización mientras que la aplicación se ejecuta:

Profiling PID 24015: org.apache.catalina.startup.Bootstrap 
    36.16% ( 57.57s) hudson.model.AbstractBuild.calcChangeSet() 
    30.36% ( 48.33s) hudson.scm.SubversionChangeLogParser.parse() 
    7.14% ( 11.37s) org.kohsuke.stapler.jelly.JellyClassTearOff.parseScript() 
    ... 

La ventaja es que no se necesita el uso de instrumentación. Las clases del jvm a ser perfilado no serán alteradas.

Si usted está buscando algo más visual a continuación, echar un vistazo a jvm-mon que se basa en jvmtop

+3

He estado jugando y maldiciendo visualvm durante años. Gracias por indicarme esta útil herramienta. Funciona sin agentes JVM, reinicios de servidores, etc. Simplemente desmarque el cuadro que desea crear, señale JAVA_HOME en el lugar correcto y ejecútelo. –

5

Hemos utilizado hprof en nuestros servidores y definitivamente es mejor que sysouts en caso de que no pueda ejecutar una sesión completa de VisualVM.

Ejemplos del uso de hprof un montón por ahí:

+0

Publicación actualizada con enlaces que puedes utilizar como punto de partida. –

+0

pero realmente no entiendo cómo puedo adjuntarlo a un pid –

+0

Lo siento, AFAIK, 'hprof' no permite adjuntar a un proceso. Su mejor opción sería buscar herramientas como jprofile y jtop. http://java.sun.com/developer/technicalArticles/J2SE/monitoring/ –

2

Usted puede ejecutar la mayoría de los perfiladores comerciales de forma remota por lo que un agente se ejecuta en el servidor y luego Conéctese con ese agente a través de un cliente en su máquina de desarrollo. Mi perfil de perfil favorito es JProfiler. Es una compra bastante razonable, y es muy estable (lo que no todos los perfiladores comerciales son ciertos).

http://www.ej-technologies.com/products/jprofiler/overview.html

Otros perfiladores comerciales que son estables, pero no es mi favorito son YourKit.

http://www.yourkit.com/

Esos proveedores más pequeños hacen buenas herramientas. Estas herramientas le proporcionarán toneladas de información sobre los tiempos de los métodos, uso de la memoria, GC, etc. Mucho más que jconsole.

13

¿Puede recolectar 10 o 20 muestras de pila con jstack? Entonces, si Foo es un método, su uso general del tiempo es la fracción de las muestras que lo contienen. Su uso de CPU es la fracción de aquellas muestras que no terminan en E/S o una llamada al sistema. Su "tiempo propio" es la fracción de muestras en la que él mismo es el término.

No necesito nada bonito. O lo ejecuto bajo el IDE y los recojo de esa manera, o uso algo como jstack que toma instantáneas de la pila de una aplicación en ejecución.

Esa es la técnica random-pause.

+1

He seleccionado esta idea: http://svn.apache.org/repos/asf/jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/Profiler. java –

+0

Esta solución me ayudó a encontrar un cuello de botella con resolución DNS en el servidor. ¡Gracias de nuevo! –

+0

@KARASZI István: Me alegro de que haya ayudado. –

11

Parece que la forma "built-in" para perfilar una aplicación Java desde la línea de comandos es comenzar con perfiles de parámetros de línea de comandos, como este

$ java -Xrunhprof:cpu=samples,file=myprogram.hprof ... 

A continuación, examinar la miprograma archivo".hprof" con alguna herramienta de interfaz gráfica de usuario (o una herramienta de servidor web como jhat) o command line tool después de salir del proceso (y el archivo se crea en ese momento).

Si se utiliza el 'QUIT' truco de la señal, se menciona https://stackoverflow.com/a/2344436/32453 entonces usted puede genere un archivo a voluntad sin salir de la JVM (parece adjuntarlo al archivo de salida anterior). O espere hasta que el proceso finalice y generará el archivo.

Este generador de perfiles muestra poco frecuentemente con baja desaceleración/impacto en general.

ref: http://web.archive.org/web/20160623224137/https://thunderguy.com/semicolon/2004/04/18/profiling-a-java-program-easily/

+1

¡Gracias por el puntero!Nota para lectores futuros: hprof está muestreando hilos en el estado de Java RUNNABLE (por lo que no es equivalente a agregar varios volcados 'jstack', como esperaba, pero tampoco mide el consumo de CPU). Tiene otros inconvenientes: ver http://www.brendangregg.com/blog/2014-06-09/java-cpu-sampling-using-hprof.html – Nickolay

Cuestiones relacionadas