1. 미들웨어이야기/01. JVM

OutOfMemory 현상정리

OSSW(Open Source System SoftWare 2009. 6. 3. 14:19

  • OutOfMemory Exception 정의

Garbage Collector가 새로운 Object를 유지하기 위해 충분한 메모리 공간을 확보하지 못할 때 발생함. Vendor사의 JVM 메모리 모델방식을 참조하여야 함.
OutOfMemory는 이하 OOM이라 약어로 표기함.

  • OOM유형별 현상정리.

Heap Memory가 Full인경우
1)응용프로그램의 특정시점에서의 과도한 메모리 사용에 의한 경우(급진적 증가)
응용프로그램에서 과도하게 heap 메모리를 사용하여 OOM이 발생하는 경우는 이 에러가 발생하는 시점의 Thread dump를 통하여 어느 프로그램인지를 판별할 수 있습니다.
특정시점에서 Thread dump를 2~3번정도 시도하여야 정확하게 어느 로직에서 문제를 야기 시키는지 명확해 집니다.
2)메모리릭에 의해 조금씩 메모리가 쌓여 가는 경우(점진적 증가)
JVM상의 응용프로그램 중에 GC대상에서 제외되는 영역에 Data를 조금씩 쌓고 있다는 얘기입니다. GC대상 제외영역을 표기하면 다음과 같습니다.


Heap Memory가 Full이 아닌경우
1) Perm 영역이 Full이 되는 경우

위와 같은 에러는 JVM에서 Perm 영역이 Full이 났을 때 나는 경우입니다. Perm영역에 는 Class Object 및 관련된 meta data가 로드 되는 영역인데 사이트가 매우 많은 수의 Class를 사용하는 경우 늘려줘야 하는 경우도 있습니다. 사이즈가 얼마가 적당한가에 대한 답은 없고 Max size까지 늘어나지 않고 일정한 사이즈를 유지하면 안정적으로 운영된다고 볼 수 있습니다. 해당 에러 발생시 –XX:MaxPermSize=256m 과같이 사이즈를 늘려 주는데 해당 조치에도 Perm영역이 늘어난다면 WAS 및 JDK Bug로 보는 것이 일반적입니다.

Native(C) heap 증가로 인한 경우
1) MAXDSIZ관련

MAXDSIZ란 Process의 데이터 세그먼트의 최대 사이즈를 의미하는데, 기본값은 64MB로 대부분의 응용프로그램에서는 너무 작은 값입니다. 이 값을 최대 적정 수치에 두어야 하는데 이 영역이 Full이 날 경우에 발생하는 OOM입니다.
JDK도 내부적으로 OS native library를 사용하고 있고, 응용프로그램 및 WAS단에서 JNI를 사용한다고 본다면 위와 같은 에러에 충분히 직면 할 수 있다고 봅니다.
해당 Kernel은 HP에 있는 Kernel parameter이므로 값이 적절하게 설정되어 있는지 체크합니다.

2) Thread 생성실패

Thread 관련 프로그램 실수로 인해 과도한 Thread를 생성할 때도 과도하게 메모리를 사용 할 수 있으므로 JVM thread dump를 통해 과도한 thread가 생성되지 않았는지 살펴 보셔야 합니다. 그리고 위 에러는 max_thread_proc라는 Kernel parameter가 너무 작기 때문에 날 수도 있으므로 HPJtune을 통해 해당 시스템의 적절한 값을 산정합니다.