태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

JMP - 공짜치곤 괜찮은 Java Profiler

Enterprise Java 2007.09.18 17:57
Java Application에서 발생하는 성능 문제를 다루다 보면 반드시 Profiler류의 툴을 사용해야 할 때가 있다. Profiler들은 다음과 같은 기본적인 기능들을 통해 Application 내부에서 발생하는 일을 좀 더 수치적인 관점에서 보게 해준다.
  • Object 생성 수치와 메모리 사용률
  • Method 호출 회수와 구동 시간
  • Garbage Collection 작동과 Heap 사용률
  • 기타 등등...
이러한 정보들은 대부분 Java API를 통해 제공되지 않으며 별도의 C/C++ Interface를 통해 제공된다. JDK 1.4까지는 JVMPI(JVM Profiler Interface)라는 이름으로 제공되었다. JDK 1.5부터는 흩어져 있던 API들을 교통 정리하고 통합해서 JVMTI(JVM Tool Interface)라는 이름으로 제공된다.

결국 Java Application을 Profiling할 수 있으려면 C/C++로 작성된 별도의 Agent가 필요한 셈이다.

다행히 Sun이 JVMPI/JVMTI를 만들면서 API의 검증 차원에서 간단한 Profiler를 만들어서 제공한다. 이것이 흔히들 사용하는 hprof(Heap and CPU Profiling Agent)이다. 다음과 같이 실행해보면 hprof가 제공하는 기능을 알 수 있다.(hprof는 어떤 종류의 JVM을 막론하고 공통적으로 제공되는 툴이다)

Prompt> java -Xrunhprof:help

HPROF: Heap and CPU Profiling Agent (JVMTI Demonstration Code)

hprof usage: java -agentlib:hprof=[help]|[

Option Name and Value Description Default
--------------------- ----------- -------
heap=dump|sites|all heap profiling all
cpu=samples|times|old CPU usage off
monitor=y|n monitor contention n
format=a|b text(txt) or binary output a
file= write data to file java.hprof[.txt]
net=: send data over a socket off
depth= stack trace depth 4
interval= sample interval in ms 10
cutoff= output cutoff point 0.0001
lineno=y|n line number in traces? y
thread=y|n thread in traces? n
doe=y|n dump on exit? y
msa=y|n Solaris micro state accounting n
force=y|n force output to y
verbose=y|n print messages about dumps y

Obsolete Options
----------------
gc_okay=y|n

Examples
--------
- Get sample cpu information every 20 millisec, with a stack depth of 3:
java -agentlib:hprof=cpu=samples,interval=20,depth=3 classname
- Get heap usage information based on the allocation sites:
java -agentlib:hprof=heap=sites classname

Notes
-----
- The option format=b cannot be used with monitor=y.
- The option format=b cannot be used with cpu=old|times.
- Use of the -Xrunhprof interface can still be used, e.g.
java -Xrunhprof:[help]|[
will behave exactly the same as:
java -agentlib:hprof=[help]|[

Warnings
--------
- This is demonstration code for the JVMTI interface and use of BCI,
it is not an official product or formal part of the J2SE.
- The -Xrunhprof interface will be removed in a future release.
- The option format=b is considered experimental, this format may change
in a future release.

위의 Descprition을 보면 알겠지만, 데모용으로 만든 것치고는 상당히 다양한 기능을 제공한다. 잘 이용하면 굳이 상용 Profiler를 사용할 필요가 없을 정도로...

하지만, 역시 GUI를 제공하지 않는다는 것은 아쉬운 점이다. 또한 Call Tree나 Object 연관 분석 등 좀 더 디테일한 정보를 제공하지 않는다는 점도 치명적일 수 있다.

불행하게도, 멋진 GUI와 더 많은 스펙을 제공하는 상용 Java Profiler들은 가격이 만만치 않다. 물론 그 가격값을 할 때가 있겠지만...

Hprof를 능가하는 Profiler를 공짜로 사용하고자 하는 사람들이 많이 선택하는 툴이 바로 JMP이다. JMP는 Java Memory Profiler의 약자로 http://www.khelekore.org/jmp/에서 정보를 얻을 수 있다.

아래 그림은 JMP를 이용해 Object/Method/Thread/GC/Heap을 모니터링하는 화면 예제이다. UI는 촌스럽지만 꼭 필요한 정보를 제공하는데는 인색하지 않다.

Prompt> java -Xrunjmp:jvmhold -Xmx258m -cp . gc_dump 1200000




http://www.khelekore.org/jmp/ 에서 설치 및 사용법, 성능 이슈에 대한 풍부한 정보를 얻을 수 있다. Java Application의 성능 문제 때문에 고민하는 사람이라면 한번 쯤 JMP를 사용해 보는 것을 고려해보는 것도 나쁘지 않을 것이다.

PS) JMP와 같은 Profiler 류의 툴은 Application의 성능을 크게 떨어뜨린다. 이것은 JVMPI/JVMTI와 같은 Interface를 사용하는 한에서는 피할 수 없는 것이다. 이러한 사실을 염두에 두고 사용해야 할 것이다...


신고
Trackback 0 : Comment 0

Write a comment

티스토리 툴바