http://j2eearchitect.net/viewtopic.php?t=1322

Java Profiling API란 무엇인가?

보통 프로파일러라고 함은 애플리케이션의 문제를 진단하고 성능을 측정하기 위해서 사용하는 도구를 의미합니다.

자바에서는 Profiling API를 통해서 애플리케이션의 다양한 정보를 프로파일링할 수 있습니다.

그렇게 하기 위해서는 어떻게 해서든지 간에 JVM의 정보를 가지고 와야 합니다. 보통 JVM의 정보를 실시간으로 가져오기 위해서 자바에서 제공하는 특별한 API를 이용하여 JVM과 통신을 시도하고 콘솔은 원격 JVM과 통신을 통해서 프로파일링 정보를 가지고 오게 됩니다.

Java Profiling API란 프로파일러와 JVM 간의 통신을 수행하고 프로파일링 정보를 가져올 수 있게 하는 Sun에서 규정한 API입니다.

이러한 API는 JVMPI와 JVMTI가 있습니다. 실제로 비슷해 보이지만 동작하는 구조와 그 특성은 서로 상이합니다.

JVMPI for Java 1.3, 1.4

JVMPI(http://java.sun.com/j2se/1.5.0/docs/guide/jvmpi/index.html)는 원래 클래식 자바 가상 머신에서 잘 동작하도록 설계되어 있기 때문에 현대적인 JVM에서는 잘 어울리지 않습니다. 예를 들면 Java 1.4가 되겠습니다.

최신의 JVM은 바이트 코드를 동적으로 최적화 하는 기능이 들어 있는데 JVMPI는 성능 정보를 수집하기 위해서 이벤트를 이용합니다.

이 이벤트가 많은 문제를 발생시키는데 대표적으로 GC를 제대로 동작하지 못하게 하는 문제점입니다. 또 다른 문제는 JVMPI가 큰 크기의 힙 메모리를 제대로 프로파일링 하지 못한다는 점입니다.

Sun에서 JVMPI를 "실험적"이라고 밝히고 있기 때문에 JVMPI는 사실 완전한 표준이 되기 어렵다고 봅니다. 하지만 실제로 마치 표준처럼 사용하고 있습니다.

JVMPI는 Java 1.3, Java 1.4에서 사용가능한 프로파일링 인터페이스이기 때문에 Java 5에서는 호환성의 이유로 JVMPI를 지원합니다. 하지만 Java 6에서는 더이상 JVMPI를 지원하지 않습니다.

일반적으로 JVMPI를 구동하려면 JVM을 구동할 때 JVM 입력 인자로 -Xrun... 을 이용합니다. 예를 들면 JProfiler는 다음과 같은 인자를 이용합니다.

코드:

#java -Xrunjprofiler FooClass

-Xrun 인자는 JVMPI를 구동하라는 의미로써 "-Xrun"을 제외한 "jprofiler"에 대해서 JVMPI를 이용하여 JVM과 통신할 네이티브 코드 파일을 의미합니다.

즉, Windows에서는 jprofiler.dll, Linux에서는 jprofiler.so, HPUX에서는 jprofiler.sl을 로딩하려고 시도합니다.

새로운 JVMTI for Java 5 이상

JVMPI의 이벤트 기반 모델 대신, JVMTI(http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/index.html)는 이른바 "bytecode instrumentation"이라는 방법을 사용합니다.

"bytecode instrumentation"이란 애플리케이션을 프로파일링 하기 위해서 프로파일링할 애플리케이션의 바이트 코드를 변경한다는 의미입니다.

즉, 모니터링 하고자 하는 바이트 코드의 정확한 위치에 프로파일링 코드를 추가함으로써 프로파일링을 수행합니다.

그러므로 이론적으로 이러한 접근은 더욱더 perspective하지만 Java 5에서 JVMTI의 구현은 여러 가지 문제가 있습니다(물론 이 문제는 Java 6에서 해결되었습니다).

-XX:+UseConcMarkSweepGC, -Xincgc 옵션을 이용한 parallel garbage collector을 지원하지 않는데 JVMPI 또한 이러한 제한이 있습니다.

그러므로 메모리 스냅샷을 생성했을 때 정확한 배열의 길이를 가져올 빠른 방법이 없습니다. 또한 여러 가지 성능 문제도 있습니다.

JVMTI는 JVMPI와 다르게 구동하는 JVM 입력 인자가 다릅니다. 예를 들어 YourKit Java Profiler의 경우 JVMTI를 활성화 시키기 위해서 다음과 같이 입력 인자를 사용해야 합니다.

코드:

#java -agentlib:yjpagent FooClass

Java 버전별 프로파일링 API 지원

* JVMPI : Java 1.3, Java 1.4 * JVMTI : Java 1.5 (강력 권장), Java 1.

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-4) was last changed on 31-Dec-2007 16:39 by DongGukLee