- 각 서비스 마다 다르지만 간혹 OutOfMemory 로 인해 서비스가 죽어 장애 상황을 경험할 수 있다. 이 때 MS(Container)를 Down 하려 해도 안 되므로 해당 프로세스를 강제로 죽여야 한다.(OutOfMemory가 계속 발생하면 MS(Container)가 좀비 상태가 되기 때문이다.)
- OutOfMemory가 발생하는 원인은 메모리 과다 사용이 주 원인인데 대용량 조회, 대용량 업로드 같은 케이스가 많다. Full GC를 하는 과정에서도 메모리를 과도하게 사용하여 OutOfMemory가 발생하기도 한다.
- OutOfMemory가 발생하면 자동적으로 Heap Dump를 생성하게 된다.(JVM 옵션이 설정돼야 생성, AIX OS의 경우 자동 생성) 파일 크기가 상당히 크다.(작게는 500MB, 크게는 10GB 까지 있다.) Heap Dump가 있어야 분석이 가능하다.
JEUS JVM Option 을 확인하자.
-Xms3072m -Xmx3072m -> Heap
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -> Metaspace
JDK 7 이하 버전을 쓴다면 MaxPermSize이다.
-verbose:gc
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC
-Xloggc:/apps_log/nsrm/jeus_log/nsrm/gclog/nsrm_gc.log
-XX:+HeapDumpOnOutOfMemoryError -> OOM 발생시 Dump 생성
-XX:HeapDumpPath=/apps_log/nsrm/jeus_log/nsrm/jeus_heap_dump
-> Dump 생성 경로
- Heap Dump는 Memory Analyzer 프로그램을 사용하여 확인한다. Dump 내용에 따라 다르지만 어떤 서비스인지, 어떤 객체를 많이 사용했는지, 관련 쿼리나 Stack Trace 등을 확인 할 수 있다.
- 이를 해결하기 위해 첫번째로 APP 수정을 하여 메모리 사용을 줄여야 한다.
- 두 번째로 Heap Memory를 늘리는 방법이 있다. 이 방법으로 일시적으로 해결 될 수 있으나 메모리 사용량이 많다면 OOM 발생 빈도만 줄어들 뿐 재 발생할 수 있다. 또한 Heap Memory를 늘리려면 서버의 물리 메모리 상태도 확인해야 한다.