Java 애플리케이션 환경인 WAS 기반에서 수행된 서비스들에 대해서는 흔히 JVM Heap 메모리 관련한 오류들을 흔히 접하게 됩니다. OOME는 Out Of Memory Error(Exception)이라고 하는데 JVM의 메모리가 부족하여 발생한 에러로 그 종류/원인은 다양합니다.
Java.lang.OutOfMemoryError는 Java.lang.VirtualMachineError의 Subclass로 JVM의 Heap Memory에 더이상 Object를 할당할 수 없을때 발생하는 오류입니다.
1. Java.lang.OutOfMemoryError: Java heap space
Java.lang.OutOfMemoryError : Java heap space는 Java의 Heap Memory 공간이 부족하여 발생합니다. 공간 부족의 원인으로는 Heap Memory의 크기가 작아서 발생하는 경우와 애플리케이션 로직의 문제로 발생하는 경우가 있습니다.
해당 오류를 해결하기 위한 가장 쉬운 방법으로는 -Xmx 옵션을 사용하여 Heap Memory의 크기를 증가시키는 방법이 있습니다. 하지만 이는 GC Time의 증가를 동반하기 때문에 충분한 사전 테스트가 필요합니다.
OOME가 발생한 시점에 생성된 Heap Dump 분석을 기반으로 쓸데없이 많은 Memory를 사용하거나 Memory Leak을 유발하는 로직을 찾아내어 수정해야 합니다.
2. Java.lang.OutOfMemoryError : PermGen space
Java Heap Memory 영역 중 Permanent 영역은 String pool, Class Method와 관련된 각종 Meta Data 등을 저장하는 용도로 사용됩니다. 따라서 JVM 기동시 로딩되는 Class 또는 String의 수가 많다면 Java.lang.OutOfMemoryError : PermGen space의 원인이 됩니다. 또한 Classloader Leak에 의해 OOME가 발생될 수 있습니다.
Permanent 영역은 Heap 영역과는 달리 일반 비즈니스 프로그램으로 핸들링 할 수 없기때문에 JVM Option 튜닝으로도 해결이 되지 않는다면 WAS 혹은 JDK 버그를 의심해봐야 합니다.
PermGen 영역은 Class를 로딩하고 해제하지 않으면 누수가 일어나며 PermGen 영역에 OutOfMemory가 발생할 수 있습니다. Class Loading 현황을 분석하려면 컨텍스트 메뉴에서 Java Basics > Class Loader Explorer를 선택해서 확인 할 수 있습니다.
'프로그래밍(TA, AA) > JVM 언어' 카테고리의 다른 글
[SPARK] 아파치 스파크란? (0) | 2018.10.08 |
---|---|
[SPARK] 스파크 주요 키워드 (1) | 2018.10.06 |
[스프링] 트랜잭션의 종류 (0) | 2018.06.03 |
[JVM Internal] JVM 메모리 구조 (1) | 2018.05.21 |
[자바] Future 패턴 (0) | 2018.05.13 |