java - remote - visualvm profiler
Tiempo total del método en Java Visual VM (7)
En Java VisualVM, ¿hay alguna manera de mostrar el tiempo total del método, en lugar del "tiempo propio"? (Esto último no es particularmente útil, ya que no te dice nada sobre cuánto tiempo realmente tardan los métodos en ejecutarse).
Si no, ¿hay algún perfilador Java independiente que calcule el tiempo total del método?
Al observar los datos de seguimiento en una vista de "instantánea", puede ver tanto el tiempo total como el tiempo propio.
Presione el botón "instantánea" que aparece sobre la tabla de resultados. Esto creará una nueva pestaña que contiene una vista de "Árbol de llamadas" que descompone el tiempo propio vs. total. La vista "combinada" también proporciona esta información, pero divide el espacio de la pantalla con una vista "Puntos calientes" que es similar a la vista de perfil estándar.
Las instantáneas se pueden crear a partir de los datos estándar "Perfilador" o "Sampler". Sin embargo, las instantáneas "Profiler" solo se pueden crear antes de que se cierre la aplicación, mientras que las de "Sampler" se pueden crear en cualquier momento.
(La información anterior se basa en VisualVM 1.3.1)
Creo que quieres saber cuánto tiempo lleva cada ejecución del método. Querrá utilizar JETM para supervisar el rendimiento. Esto le daría tiempo de entrada, tiempo de salida y una diferencia de tiempo para cada método. Descubriría qué método está tomando cuánto tiempo.
Si está utilizando Spring, será fácil integrar JETM http://jetm.void.fm/howto/spring_2_x_integration.html
Hay una manera simple de obtener el tiempo total de una rutina como un porcentaje del tiempo de ejecución del reloj de pared (en lugar de milisegundos). Simplemente usa ctrl-break para obtener un montón de stackshots mientras lo esperas. La fracción de ellos que contiene la rutina es el% de tiempo que toma. La precisión depende de la cantidad de disparos que realice. Si solo está buscando dónde están los problemas, no necesita medición de tiempo de precisión. Aquí hay una breve explicación de cómo funciona.
JavaAssist es una biblioteca de clases para manipular su código de Java Byte sin tocar la fuente. Tomemos un ejemplo de medir el tiempo tomado para ejecutar un método.
public class Subject {
/**
* Timetaken for start & end of the method
*
* @throws InterruptedException
*/
public void method2() throws InterruptedException {
// Some business logic :)
Thread.sleep(2000);
}
}
Para medir el tiempo necesario para ejecutar subject.method2()
, puede mejorar Subject.methods()
agregando el código de inicio y fin del método como se muestra.
public class JavaAssist {
public static void main(String[] args) {
timeTaken();
}
public static void timeTaken() {
try {
ClassPool p = ClassPool.getDefault();
CtClass cc = p.get("Subject");
CtMethod meth2 = cc.getDeclaredMethod("method2");
meth2.insertBefore("System.out.println(/" Start : /"+new java.util.Date());");
meth2.insertAfter("System.out.println(/" End : /"+new java.util.Date());");
// cc.writeFile(".");
Class c = cc.toClass();
Subject s = (Subject) c.newInstance();
s.method2();
cc.detach();
} catch (Exception e) {
// suppressed
}
}
}
Salida: Inicio: miércoles 26 de mayo 17:24:18 EDT 2010 Fin: miércoles 26 de mayo 17:24:20 EDT 2010
Referencia http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#read
http://www.csg.is.titech.ac.jp/~chiba/javassist/html/
Publicación de origen de: http://www.senthilb.com/2010/05/javaassist-byte-code-enhancement.html
Solo tome una instantánea de los resultados del perfil. Obtendrá el tiempo del reloj de pared así como el tiempo del auto allí.
podrías usar un
long startTime = System.currentTimeMillis();
en el principio
y
long endTime = System.currentTimeMillis();
y finalmente para obtener el resultado
long result = endTime - startTime; //Note, part might be backwards, I don''t
//Remember
puede usar jprofiler o algunas herramientas de javaagent para monitorear el tiempo de ejecución del método para usted. Hay algunas herramientas de código abierto en github, como simpleAPM.