2009-12-12 6 views
45

Java VisualVM에서 "self time"이 아닌 총 메소드 시간을 표시하는 방법이 있습니까? (실제로 메소드가 실행되는 데 걸리는 시간을 알려주지 않으므로 후자는별로 유용하지 않습니다.)Java VisualVM의 총 메소드 시간

그렇지 않은 경우 총 메소드 시간을 계산하는 독립형 무료 Java 프로파일 러가 있습니까?

답변

47

"스냅 샷"보기의 추적 데이터를 보면 자체 시간뿐만 아니라 총 시간을 볼 수 있습니다.

결과 테이블에 나타나는 "스냅 샷"버튼을 누릅니다. 이렇게하면 자동 시간과 총 시간을 구분하는 "호출 트리"보기가 포함 된 새 탭이 생성됩니다. "결합 된"뷰는이 정보도 제공하지만 표준 프로파일 링 뷰와 유사한 "핫 스폿"뷰로 화면 공간을 분할합니다.

스냅 샷은 표준 "프로파일 러"또는 "샘플러"데이터에서 만들 수 있습니다. 그러나 "프로파일 러"스냅 샷은 응용 프로그램이 닫히기 전에 만 만들 수 있으며 "샘플러"스냅 샷은 언제든지 만들 수 있습니다.

(위의 정보는 VisualVM 1.3을 기반으로합니다.1)

+4

이 대답은 가장 깊고 도움이됩니다. 나는 그것의 짧은 스크린 캐스트를 만들었다. http://rhnh.net/2011/08/03/profiling-clojure –

+0

Xavier, 스크린 캐스트에 감사드립니다. 그것은 그것을 분명하게했다. –

-3

당신은 총 얻을 수있는 간단한 방법이있다

long endTime = System.currentTimeMillis(); 

그리고 마지막으로이 결과

long result = endTime - startTime; //Note, part might be backwards, I don't 
            //Remember 
+0

end - start ... 그렇지 않으면 다음과 같은 식으로 끝납니다. 0 - 100 = -100 100 - 0 = 100의 무비. – TofuBeer

+0

감사합니다. 뒤로 향하게했을 것입니다. – Brendan

+8

시스템 사용 .nanoTime(), currentTimeMillis()는 os 인터럽트 속도 때문에 오류가 발생하기 쉽습니다. http://blogs.sun.com/dholmes/entry/inside_the_hotspot_vm_clocks –

1

를 얻기 위해 beggining에서

long startTime = System.currentTimeMillis(); 

를 사용할 수 있습니다 루의 시간 벽 시계 실행 시간의 백분율 (milliseconds가 아닌). 기다리는 동안 ctrl-break를 사용하여 스택 샷을 얻으십시오. 루틴이 포함 된 비율은 소요 시간 비율입니다. 정확도는 촬영하는 횟수에 따라 다릅니다. 문제가있는 곳을 찾고 있다면 정확한 시간 측정이 필요하지 않습니다. Here's a short explanation of how it works.

7

프로파일 링 결과의 스냅 샷을 찍으십시오. 벽시계는 물론 자기 시간을 얻을 수 있습니다.

-1

JavaAssist는 소스를 건드리지 않고 자바 바이트 코드를 조작하는 클래스 라이브러리입니다. 방법을 실행하기 위해 취해진 시간을 으로 측정하는 예를 들어 봅시다.

public class Subject { 
    /** 
    * Timetaken for start & end of the method 
    * 
    * @throws InterruptedException 
    */ 
    public void method2() throws InterruptedException { 
     // Some business logic :) 
     Thread.sleep(2000); 
    } 
} 

는 그림과 같이 코드의 시작과 방법의 끝을 추가하여 Subject.methods()을 향상시킬 수 subject.method2() 실행에 걸리는 시간을 측정합니다.

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 
     } 
    } 
} 

출력 : 시작 : 수요일 5월 26일 동부 서머 타임 17시 24분 18초 2010 종료 : 수요일 5월 26일 동부 서머 타임 17시 24분 20초 2010

참조 http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#read

http://www.csg.is.titech.ac.jp/~chiba/javassist/html/

출발지 : http://www.senthilb.com/2010/05/javaassist-byte-code-enhancement.html

0

각 메서드 실행에 걸리는 시간을 확인하고 싶습니다. JETM을 사용하여 성능을 모니터하고 싶을 것이다. 이것은 각 방법에 대한 입구 시간, 출구 시간 및 시차를 제공합니다. 얼마나 많은 시간이 걸리는지 알 수 있습니다. 당신은 스프링을 사용하는 경우

그때 당신이 방법은 말했나 시간을 실행 모니터링하는 JProfiler와 또는 일부 javaagent 도구를 사용할 수 있습니다 JETM에게 http://jetm.void.fm/howto/spring_2_x_integration.html

0

를 쉽게 통합 될 것은처럼 GitHub의에 대한 몇 가지 오픈 소스 도구입니다 simpleAPM.