반응형

Java 프로그램은 처음 시작할 때 사용할 Heap메모리 영역을 할당하고 시작한다. 만일 이러한 Heap영역이 부족하게 되면 OutOfMemoryError이라는 에러를 발생시키고 비정상 종료하게 된다.

이러한 OutOfMemoryError이 발생할 경우 개발자는 난감한 상황에 빠지게 되는데, 어떤 프로그램에서 메모리를 많이 잡아 먹었는지 파악하기 힘들기 때문이다.

이러한 경우 일반적으로 사용되는 도구가 Profiler인데, Profiler의 가장 큰 문제는 사용하게 되면 실행 속도가 10배 이상 느려져서 정상적으로 동작하기 힘들어 진다. 그래서 Profiler를 사용하게 되면 OutOfMemoryError이 발생하지 않는 경우도 종종 있다.

그러면 이러한 OutOfMemoryError를 좀더 현실적으로 진단할 방법은 무엇일까?

1. IBM JVM의 경우

IBM JVM을 사용해 보신 분들을 이미 알고 있겠지만 IBM에서는 Heapdump라는 메모리의 Heap정보를 파일로 추출하는 기능을 제공해 준다. (필자의 경우 IBM JVM의 가장 큰 장점이라고 생각하는 기능이다.)

AIX와 같은 IBM OS에서 프로그램을 실행시켜 보신 분들은 아래와 같은 파일이 생성된 것을 볼 수 있었을 것이다.

확장자가 phd로 끝나는 파일이 Heapdump파일이고 javacore로 시작되는 파일이 Threaddump 파일이다.

Threaddump는 파일을 읽는 방법만 익히면 어렵지 않게 읽을 수 있다. 관련 내용은 추후에 다른 포스트에서 설명하겠다.

하지만 Heapdump파일의 경우 별도의 Tool이 필요하다. IBM은 HeapRoots라는 명령창 기반 프로그램과 HeapAnalyzer라는 GUI기반 프로그램을 제공한다.

HeapRoots의 경우 복잡하지는 않지만 별도의 사용법을 알아야 하지만 HeapAnalyser의 경우 직관적인 UI가 제공되서 쉽게 사용이 가능하다.

각 프로그램은 다음 링크에서 다운 받을 수 있다.

Heap Analyzer를 실행한 화면은 아래와 같다.

 

2. SUN JVM의 경우

SUN JVM의 경우 Heapdump를 따로 제공하지 않았었다. 정석은 Profiler를 이용하는 것인네 너무 느리기 때문에 여러가지 편법들이 난무했는데, 그 중에는 IBM Heapdump 모듈을 이용하는 편법도 있었다.

IBM HeapDump for Solaris : http://www.skywayradio.com/tech/WAS51/IBMHeapDump/ 

하지만 JDK 1.4.1에서만 동작하고 1.4.2이후 버전에서는 동작하지 않는다는 치명적인 단점이 있었다.

시간이 지나 Java 5가 나오면서 SUN도 운영 관리의 중요성에 눈을 조금씩 떠가면서 JMX 가 추가되었고 HotSpot VM 명령 옵션에 Heapdump를  추출하는 옵션을 추가하게 되었다.

옵션은 다음과 같다.

-XX:+HeapDumpOnOutOfMemoryError

이 옵션은 1.5.0_07 이나 1.4.2_12 이상 버전 부터 지원한다.

옵션을 추가해서 실행하면 아래와 같이 나온다.

$ java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512m ConsumeHeap
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid2262.hprof ...
Heap dump file created [531535128 bytes in 14.691 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at ConsumeHeap$BigObject.(ConsumeHeap.java:22)
        at ConsumeHeap.main(ConsumeHeap.java:32)

파일은 현재 폴더에 HPROF 바이너리 포멧으로 생성되고 JHAT(Java Heap Analysis Tool)와 같이 HPROF 포멧을 지원하는 툴로 분석할 수 있다.

JHAT : http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html

만일 폴더를 변경하려면 -XX:HeapDumpPath= 옵션을 이용할 수 있다.

관련 링크 : http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/gdaog.html#gbzrr

                  http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/gblfj.html

3. HP JVM의 경우

SUN JVM과 동일한데 1.5.0_04 나 1.4.2_11부터 지원한다. 상세한 내용은 아래 링크를 참고한다.

Java Troubleshooting Guide for HP-UX Systems : http://docs.hp.com/en/5992-1918/5992-1918.pdf

분석하는데 HPJtune를 사용한다.

HPjtune :  http://www.hp.com/products1/unix/java/java2/hpjtune/

 

 
 
반응형

+ Recent posts