카테고리 없음

Eclipse Memory Analyzer

Soul-Learner 2012. 8. 26. 14:55

개 요

Java 프로그램을 실행하다보면 Heap 영역의 메모리가 부족하여 오류(OutOfMemoryError)가 발생하는 경우가 있다. Heap 영역에 생성된 자바 객체는 해당 객체의 참조가 하나도 없는 경우에는 Garbage Collector에 의해 메모리에서 제거되고 메모리가 반환된다. 그러나 어떤 이유로 인하여 메모리가 반환되지 않아서 계속 메모리를 점유하며 가용한 메모리는 점차 줄어들고 결국 OutOfMemoryError를 발생하기에 이르는 경우도 있는데, 이런 경우에는 Heap 메모리의 상태를 확인하고 어떤 객체가 메모리를 점유하고 있는지 알 수 있다면 메모리가 반환되지 않는 원인을 분석할 수 있을 것이다. 반환되어야 하는 메모리가 반환되지 않는 현상을 Memory Leaks(메모리 누수)현상이라고 한다. 

Eclipse Memory AnalyzerOutOfMemoryError 가 발생할 때 그 원인을 파악하기 위해서 Heap 영역의 메모리 상태를 다양한 방법으로 분석하여 보여주기 위해 사용되며 Eclipse의 Plugin이나 Stand-Alone 형태의 오픈소스로 배포되고 있다.


-XX:+HeapDumpOnOutOfMemoryError

OutOfMemoryError 오류가 발생했을 때의 Heap 영역의 상태를 알 수 있다면 메모리 누수의 원인을 발견하는데 도움이 될 것이다. JVM의 실행옵션을 위와같이 설정하여 메모리 부족 오류가 발생했을 때의 상태를 *.hprof 파일로 저장할 수 있다.


JVM 옵션 설정

Eclipse Project 위에서 마우스 오른쪽 > Run AS > Run Configurations.... > Arguments > VM Arguments 입력란에 다음과 같이 입력하여 옵션을 설정할 수 있다.  -XX:+HeapDumpOnOutOfMemoryError


옵션설정 후에 OutOfMemoryError 발생한 경우

위의 옵션을 JVM 에 설정한 후에 아래의 코드를 작성하고 실행한다

Main.java

import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<String>(); while (true){ list.add("무한루프 안에서 문자열 저장하기"); } } }


위의 코드를 실행하면 다음과 같이 오류가 발생하면서 Heap 영역의 상태를 저장한 *.hprof 파일이 생성된다

java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid3448.hprof ... Heap dump file created [87394094 bytes in 1.143 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2245) at java.util.Arrays.copyOf(Arrays.java:2219) at java.util.ArrayList.grow(ArrayList.java:213) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187) at java.util.ArrayList.add(ArrayList.java:411) at Main.main(Main.java:9)



Eclipse Memory Analyzer

위와같은 절차를 통하여 생성된 *.hprof 파일을 읽어들여서 그래프나 히스토그램등의 수단을 통해 Heap영역의 상태를 분석한 결과를 보여주는 툴이 바로 Eclipse Memory Analyzer 이다. Eclipse의 Plugin 형태나 Stand-Alone 형태로 배포되고 있다.