2017-01-23 16 views
10

나는 런타임 동안 다양한 목적으로 클래스 파일을 계측하고있다. JVMTI 에이전트를 사용하고 있습니다. 방법을 도구로 사용하려는 나의 전략은 RetransformClasses 함수를 호출하여 ClassFileLoadHook을 호출하는 것입니다. 이 전략은 실제 계측이 후속 함수 호출에서 발생하기 때문에 계측 시간 이후에 추가 호출을하는 모든 메소드에 대해 잘 작동하지만 프로그램에 main 함수와 같은 추가 호출이없는 메소드에서는 작동하지 않기 때문에이 방법이 효과적입니다.추가 호출이없는 JVMTI 에이전트로 실행중인 메소드를 재 변환하는 방법은 무엇입니까?

실행하는 동안 즉석에서 메서드를 측량하고 싶습니다. 계측 코드의 OSR (On-Stack Replacement)과 같은 절차가 필요합니다. JVMTI 또는 다른 방법으로 사용할 수있는 전략이 있습니까?

추신 : OpenJDK 소스 코드를 편집/패치하는 데 도움이 될 경우 공개하겠습니다.

+0

내가 얻지 못하는 것 : 그러한 방법이 ** 결코 부름받지 않을 것이라는 점을 고려하면; 그것을 조작하는 요점은 무엇입니까? 내 말은 나중에 메서드를 호출 할 때 "통찰력"을 부여하는 도구가 아니라는 것입니다. 메서드가 호출 될 때처럼? – GhostCat

+0

프로파일 링 **에 대한 계측과 관련하여 귀하는 정확합니다. 메서드에서 장시간 실행되는 루프를 병렬 처리하는 코드를 구현하고 있습니다. 그래서 당신이'main'에 지루한 루프를 가지고 있다면, 나는 스레드를 생성하고 em에 참여하기를 원합니다 (물론 병렬화 가능하다면). 그래서 단일 호출 함수를 구현하는 것이 중요했습니다. –

+0

javaagent를 살펴 보았습니까? –

답변

2

조금 더 생각해 보면, 나는 을 믿는다. 어쩌면 (어쩌면!) 기술적으로 가능할 수도있다. 그러나 많은 노력이 필요합니다. 그러나 개념적으로 그것은 좋은 접근 방법이 아닙니다.

나는 귀하의 요구 사항이 실제로 악기 "커버 병렬화에서"수행하여 성능을 향상시키기 위해 당신을 던져 응용 프로그램의 종류한다고 가정 . 대신 실제 솔루션을 필요로

그래서, 내가 주로 관심 목록이 있습니다 모든

  • 먼저, 당신도 이미 트리거하고 현재 실행되는 방법을 수정하려면, 당신은 도구 사용에 대해서만 이야기하는 것이 아닙니다. 당신이 실제로하고 싶은 것은 당신 자신의 "JIT"메커니즘을 제공하는 것입니다 - JVM JIT도 거기에 있고 그 일을하는 동안.
  • 그래서, 당신이 정말로 이것에 대해 진지한가? 어떤 main()에있는 것들이 당신의 최적화로부터 이익을 얻을 수 있는지 확인하고 싶습니다. 그러면 개념적으로, 자신의 JVM을 설계하고 구현하는 것이 좋습니다.
  • 그렇다면 궁금합니다. 이미 "긴 시간 루프"를 실행하는 main() 메서드를 다루고 싶다고 말하고 있습니다. 당신이 계기를 던져서 나쁜 디자인 을 고치려고하는 것 같습니다. 제 생각에 좀 더 정상적인 접근법은 다음과 같습니다. 그러한 응용 프로그램을 살펴보고 은 자신의 디자인을 개선하는입니다.
  • 임의의 애플리케이션을 "병렬화하는"것이 "쉽다"면, 어쨌든 JVM의 일부가 될 것입니다. 그리고 그것이 사실이 아니라는 사실. 그리고 JVM이 그런 종류의 최적화를하지 않는다는 것이 좋은 이유입니다. 아마도 정확하고 견고하기 때문에 수퍼 하드입니다.

다른 말로하면 : 입니다. XY 문제가 있습니다. X 문제는 당신이 다루는 응용 프로그램이 "병렬화"의 이점을 얻을 수 있다는 것입니다. 그러나 그것은 "일반적으로"하는 것이 매우 어렵습니다.

그런 의미에서; 오히려 어떤 종류의 아키텍처 (응용 프로그램을 "시작"하는 방법에 대한 명확하고 명확한 단계가 포함되어 있으므로 계측이 성공적으로 수행 될 수 있도록)를 정의하고 해당 접근 방식을 먼저 경험해보십시오.의미 : 처음에는 "012or"에 "장시간 반복되는 루프"를 넣지 말라고 사람들에게 말하면서 (나에게 꽤 나쁜 디자인처럼 들린다.)

+0

더 많거나 적습니다. 내 주요 관심사는 응용 프로그램의 Java 소스가 없다는 가정하에 Java 코드에서 암시 적 병렬 처리를 이용하는 것입니다. 분석에 관한 한, 병렬화를위한 바이트 코드를 분석하면 완벽하게 작동합니다. 분명히 그것은 분석하기가 정말로 어렵지만, 이것이 나의 주요 관심사는 아닙니다. 간단히 말해서 수업을 재정의하는 것에 관심이 있습니다. 수업 시간에 수업을 이미 준비하고 있으며 원하는 결과를 얻고 있습니다. 이제는 JIT 프로파일 러를 사용하여 일부 핫스팟을 분류하고 이들을 병렬 처리합니다. –

+0

핫스팟을 사용하는 이유도 분명합니다. 공리는 "모든 루프는 병렬화 할 가치가 없습니다. 핫팟 만 있습니다." 이를 염두에두고 필자는 자연스럽게 코드에서 핫스팟을 실행하는 도구를 사용하고자합니다. 런타임 동적 인스 트루먼 테이션이 제공됩니다. –

+1

* 병렬화를위한 바이트 코드를 분석하면 완벽하게 작동합니다. ... ... 꽤 대담한 성명입니다 .-- 나는 지금까지 간과하고있는이 영역에서 연구하고있는 사람들이 얼마나 많은지 당신이 발견했는지 궁금합니다. – GhostCat