2011-05-11 4 views
1

JVMTI을 사용하여 구현 한 프로파일 러에 대해 모든 Java 메소드의 실행 시간을 측정하고 싶습니다. JVMTI의이 이벤트 제공 :JVMTI로 Java 실행 시간 측정

사용 방법 :

  • MethodEntry
  • MethodExit

그래서이 구현하기가 매우 쉬울를, 그러나 나는 API이 note 건너 온 항목 또는 종료 이벤트는 많은 플랫폼에서 성능을 크게 저하 시키므로 성능에 중요한 사용 (예 : 프로파일 링)에 대해서는 권장되지 않습니다. 이러한 경우에는 바이트 코드 계측을 사용해야합니다.

그러나 프로파일 링 에이전트는 헤드리스로 작동합니다. 즉, 수집 된 데이터가 직렬화되어 소켓을 통해 결과를 표시하는 서버 응용 프로그램으로 전송됩니다. 바이트 코드 계측을 사용하여 이것을 어떻게 실현해야합니까? 나는 여기에서 어떻게 나아갈 지 혼란 스럽다. 누군가가 나에게 설명 할 수 있을까? 만약 내가 전략을 바꾸어야한다면 어떻게 될까? 아니면 내가 어떻게이 문제에 접근 할 수 있을까?

+0

자신의 프로파일 러. VisualVM 및 YourKit과 같이 기존 프로필이 어떻게 작동하는지 살펴보고 사용자가 이미 필요한 것을 수행하지 않는지 확인하는 것이 좋습니다. –

+0

그들은, 나는 다만 그것을 나 자신하고 싶다. 하지만 VisualVM은 힌트 일 수 있습니다. 어떻게해야 볼 수 있습니다.하지만 내 교훈에 따르면 Java 에이전트를 사용하고 원시 에이전트가 아닙니다. –

+0

VisualVM은 소스를 얻을 수있는 Java 에이전트를 사용합니다. YourKit는 소스를 얻을 수없는 원시 에이전트를 사용합니다. 데이터를 기록하는 것은 데이터의 시각화를 얻는 것만 큼 어렵지 않습니다. YourKit이 시각화를 수행하는 방법을 살펴 보겠습니다. –

답변

1

Sun JVM에 대해서는 잘 모르지만 IBM JVM은 MethodEntry/Exit 이벤트를 요청할 때 FullSpeedDebug 모드라고 부릅니다. FSD는 실행 속도가 느려집니다.

프로필 작성자로서 BCI를 사용할 수 있다고 말하지만 어떤 방법을 선택하는지가 아니라면 느려지기도합니다. 예를 들어 내 프로파일 러는 모든 항목에 if (프로파일 링) callProfilerHook()을 삽입하고 모든 객체가 작성하는 메소드 및 가능한 다른 모든 영역에 가능한 모든 종료를 삽입합니다. 이러한 추가 검사는 실행 속도를 50 % 이상 저하시킬 수 있습니다. ..

BCI에 관해서는 ... 잘 자기 자신의 C 라이브러리를 작성했습니다 ... 기술적으로 어렵지는 않습니다. (힌트를 사용하면 StackMapTable을 삭제할 수 있습니다.)하지만 잠시 시간이 걸릴 수 있습니다. ASM 외 사용. al.

마지막으로 ... callBackHook은 오버 헤드를 추가하고 작은 메서드에서는 정교한 오버 헤드 계산을 수행하지 않는 한보고 된 CPU/Clock 시간을 렌더링하지 않습니다 ... 이렇게해도 콜백 코드는 프로세서 L1의 모양에 영향을줍니다 캐시 및 Java 코드의 공간이 적기 때문에 효율성이 떨어집니다.

내 프로파일 러는 기본적으로 흥미로운 방식으로 실행을 시각화 할 때보고 된 시간을 무시합니다. 코드, 실제로 어떤 코드가 실행 중인지 (대부분의 Java 프로젝트는 해당 앱에서 실행되는 제 3 자 코드 라인에서 수백만 달러의 아이디어가 전혀 없음)

+0

안녕하세요, 여기에 stackoverflow에 다른 질문에 내게 준 조언을 주셔서 다시 한 번 고마워, 정말 내 프로젝트 압연 있어요. 나는 당신의 논쟁을 정말 좋아하며 이것이 내가 붙잡을 점이라고 생각합니다. 나는 가장 많은 시간이 소비되는 곳과 방법이 얼마나 오래 필요한지 측정하고 싶다. 따라서 MethodEntry와 MethodExit는 여전히 사용할 수 있다고 말할 수 있습니다. 그건 그렇고, 내 프로젝트를 지금 찾을 수 있습니다 : https://github.com/platzhirsch/Profiling-Concurrency –

+0

부스트와 protobuf ... 우수한 선택 .... 나중에 빌드됩니다 –