2011-08-26 14 views
6

Quiero filtrar qué clases están siendo perfiladas por CPU en Java VisualVm (Versión 1.7.0 b110325). Para esto, intenté en Profiler -> Configuración -> Configuración de CPU para establecer "Profile only classes" en mi paquete bajo prueba, que no tuvo ningún efecto. Luego traté de deshacerme de todas las clases java. * Y sun. * Configurándolas en "No perfil clases", que tampoco tuvieron ningún efecto.¿Las clases de filtrado para el perfil de CPU funcionan en Java VisualVM?

¿Es esto simplemente un error? ¿O me estoy perdiendo algo? ¿Hay alguna solución? Quiero decir que no sea:

Quiero hacer esto principalmente para obtener porcentajes correctos a medias de la CPU consumida por método. Para esto, necesito deshacerme de las mediciones molestas, p. para sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() (alrededor del 70%). Muchos usuarios parecen tener este problema, ver p.

+0

¿Es su propósito hacer que el código se ejecute lo más rápido posible? o solo para obtener algunos porcentajes, independientemente de lo que signifiquen? El "tiempo" como se usa comúnmente es muy ambiguo. –

+0

Sí, mi objetivo principal es hacer que el código se ejecute más rápido. También me gustaría tener una estimación de cuánto debería cambiar el código. Así que quiero obtener una visión general aproximada de todos los puntos conflictivos y su gravedad. Creo que los resultados de VisualVm serían aceptables para esto a pesar de usar el tiempo de pared, si tan solo las pocas clases de sun. * Y java. * No estropearan todas las estadísticas. – DaveFar

Respuesta

10

La razón por la que ve sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() en el perfil es que dejó la opción Perfil nuevo Runnables seleccionado.

Además, si tomó una instantánea de su sesión de generación de perfiles, podría ver toda la lista de llamadas para cualquier método de zona activa: de esta manera podría navegar desde el método run() hasta sus propios métodos lógicos de aplicación, filtrando el ruido generado por el Perfil nuevo Runnables opción.

+0

Gracias JB (+5), verificará esa opción el lunes - suena como la solución :) Tomé una instantánea, que me dio la vista de árbol de llamadas, lo cual no es bueno ya que solo la vista de Profiler me da los porcentajes de CPU consumida por método. Debido a la recursividad, mi lista de llamadas es demasiado compleja para obtener información de rendimiento sensible de ella. – DaveFar

+0

Gracias JB, desactivando la opción "Perfil nuevo Runnables" hizo el truco. – DaveFar

+2

Tenga en cuenta las consecuencias de deshabilitar la opción antes mencionada. Con la opción activada, obtendrá información sobre todos los hilos/ejecutables recién iniciados automáticamente. Con esa opción desactivada, debe asegurarse de proporcionar una lista exhaustiva de métodos de raíz. –

0

OK, ya que su objetivo es hacer que el código se ejecute lo más rápido posible, permítanme sugerir cómo hacerlo. No soy un experto en VisualVM, pero puedo decirte lo que funciona. (Sólo unos pocos perfiladores en realidad le dicen lo que necesita saber, que es - qué líneas de código en la pila una fracción saludable del tiempo del reloj de pared.)

La única medida que molestarse con es algunos cronómetros en el tiempo total, o alternativamente, si el código tiene algo así como una tasa de cuadros, el número de cuadros por segundo. No necesito ningún tipo de desglose de precisión adicional, porque en el mejor de los casos es una pista remota de lo que está perdiendo el tiempo (y más a menudo totalmente irrelevante), cuando hay una forma muy directa de localizarlo.

Si no quiere hacer random-pausing, depende de usted, pero está comprobado que funciona, y here's an example of a 43x speedup.

Básicamente, la idea es que obtienes un número (pequeño, como 10) de muestras de pila, tomadas aleatoriamente en el reloj de pared. Cada muestra consta (obviamente) de una lista de sitios de llamadas, y posiblemente un sitio que no es de llamadas al final. (Si la muestra está en E/S o en suspensión, terminará en la llamada al sistema, que es lo único que desea saber)

Si hay una forma de acelerar su código (y seguramente lo habrá), lo verá como una línea de código que aparece en al menos una de las muestras de la pila. La probabilidad de que aparezca en cualquier muestra es exactamente la misma que la fracción de tiempo que utiliza. Entonces, si hay un sitio de llamada u otra línea de código que utiliza una fracción de tiempo saludable, y puede evitar ejecutarlo, el tiempo total disminuirá en esa fracción.

No conozco todos los perfiles, pero uno que sé que puede decir que es Zoom. Otros pueden ser capaces de hacerlo. Pueden ser más interesantes, pero no funcionan más rápido o mejor que el método manual cuando su propósito es maximizar el rendimiento.

+0

Tenga en cuenta que en JVM puede ocurrir que un método no aparezca nunca en el seguimiento de la pila, incluso si se ejecuta con bastante frecuencia. La razón de esto es la forma en que la JVM permite tomar trazas de pila: una traza de la pila de un subproceso se puede tomar solo en el punto de control que JIT no puede insertar en cada método. –

+0

Eres bastante el "evangelista de pausas al azar", Mike :) Gracias de todos modos por la respuesta, la habría votado si no te hubiese dado un enlace describiendolo ya. Lo intenté, pero debido a la recursión, la pila de llamadas es bastante compleja. Una vista de perfil lo divide en métodos con un porcentaje de tiempo de ejecución, por lo que los puntos críticos son mucho más fáciles de ver. En segundo lugar, la vista de perfil muestra todos los puntos conflictivos y su gravedad. Esto proporciona una buena visión general de qué y cuánto ajuste debe hacerse. ¿Estás de acuerdo? – DaveFar

+0

@DaveBall: No se trata de puntos de acceso y medición. Sí, la pila de llamadas es compleja y hay recurrencia. Aún así, vea si puede seleccionarlo todo y copiarlo a un editor. Luego, estudíelo y vea si puede responder la simple pregunta "¿Qué está haciendo en ese momento y por qué lo está haciendo?" Entonces hazlo de nuevo solo unas pocas veces. Eso le mostrará por qué está gastando el tiempo, y le mostrará en qué debe concentrarse. No te intimides por la recursividad o una pila compleja. Cualquier línea de código que veas en 2 de 3 muestras te está costando (2 + 1)/(3 + 2) = 60% en promedio. Buena caza. –

Cuestiones relacionadas