[JVM] Heap dump 힙 덤프 개념 - 왜 필요한가

2021. 12. 16. 12:10 JAVA/JVM
Heap 힙!

동적으로 할당되어 사용할 수 있는 메모리 영역
주로 실행중에 생성되는 객체들이 저장되고, 실행 후 제거되는 영역
GC(Garbage Collection)의 대상의 되는 메모리 영역
가비지 컬렉터는 가비지 컬렉션을 통해 힙 영역에 있는 사용되지 않는(더이상 참조가 없는) 객체를 회수한다. 

Memory Leak 메모리 누수!

힙 영역에 있는 동적으로 할당된 객체가, 더이상 사용되지 않음에도 불구하고 가비지 컬렉터에 의해 회수되지 않고 메모리에 남아있어서 자리만 차지하는 현상
메모리 누수가 쌓이면 메모리가 부족하게되서 결과적으로 OutOfMemoryError 가 발생한다
가비지 컬렉터는 메모리 누수인지도 모르고, 메모리가 부족하니까 계속 메모리를 회수하려고 가비지 컬렉션을 지속적으로 발생시킨다. 결국 너무 자주 일어나는 가비지 컬렉션은 성능상 문제를 일으킨다.

OOME : OutOfMemoryError

OOME는 대부분 개발이 완료된 후 사용자 테스트 혹은 인수 단계에서 많이 발생한다. 개발환경에서 테스트하다가 사용자환경으로 인수한 경우 많이 발생한다. 이럴때, 빠른 대응이 필요한다.
JVM Option을 조정하거나, 힙 덤프 파일의 분석을 통해 대응을 한다. 

JVM Option

자바의 최대 장점으로 JVM이 OS위에서 돌아가면서 자바 어플리케이션은 어떤 OS 위에서도 동작할 수 있다. 하지만, 동작만 할 뿐이지 최적화가 되어있는 것은 아니다. 따라서 JVM 옵션을 통해 최적화하도록 옵션을 제공한다. 

JVM Option 종류

Standard 표준, Non-Standard 비표준 Option으로 나뉜다. 표준 옵션은 JVM 벤더와 상관없이 동일한 옵션을 갖는다. 비표준 옵션은 주로 -X, -XX로 시작되며, 힙메모리 사이즈와같이 최적화를 위한 옵션들이 존재한다. 각 옵션들을 일일이 외울 필용는 없다. 오라클 홈페이지를 필요할때 참조하자. 
Ex. -XX:PermSize => 힙 메모리의 Permanent 사이즈 조절.
※ Permanent 등 JVM의 힙 메모리 구조는 http://blog.naver.com/kbh3983/220967456151 참조

 

Heap Monitoring  힙 모니터링

메모리 누수가 많이 발생해서 GC가 많이 발생하고 성능상 문제를 일으킬 때면 약간 늦은감이 있다. 
힙 모니터링을 통해 일이 커지기 전에 메모리 누수를 찾아내자. 

위와 같이, GC가 계속 수행되도 Used 메모리가 떨어지지 않고 증가할 경우 메모리 누수를 의심해볼 수 있다. 이러한 경우 힙덤프를 생성하고,  HeapAnalyzer를 통해 분석해야 한다. 
(힙 모니터링 도구 설치 및 사용법은 추후 포스팅 예정)

Heap Dump 힙덤프!

메모리 누수 문제를 힙 덤프를 통해 분석할 수 있다. 
덤프파일이란, 덤프를 뜰 때의 어플리케이션의 상태를 스넵샷 형태로 파일로 저장한 것이다.