[오류 노트] OOM 은 왜 발생할까 ?

mallin·2022년 6월 27일
0

오류 노트

목록 보기
3/3
post-thumbnail

오류 발생 상황

어느날 ... 오류 slack 알림 봇 에서 엄청나게 많은 java.lang.OutOfMemoryError: GC overhead limit exceeded 에러가 떨어지기 시작했다.

https://media.giphy.com/media/d2lcHJTG5Tscg/giphy.gif

배포 나간 것도 없는데 왜 그러는겨 🤔
정말 울고 싶었지만 ,,, 그럴 시간도 없었다.
일단 우선순위를 시스템 안정화로 두고,

  1. 서버 2대 스케일 아웃
  2. 코드 재배포

를 하고 나니 응답 시간이 많이 줄어 들었고, 오류가 발생하지 않기 시작했다.

잠깐 한숨을 돌리려는 순간 ! 다시 오류가 나기 시작했다. 🤯
눈물 흘릴 준비를 하고 있던 그때 다른 개발자 분이 최대 힙 메모리를 늘려야 한다고 말씀을 해주셨다.

  1. 서버 스펙업
  2. heap 사이즈 늘림
vim /etc/systemd/system/java-application.service
Xmx 사이즈 늘림 

결국 이렇게 대처를 하고 나니깐 OOM 이 발생하지 않았다.
그렇다면 OOM 은 왜 발생하고 heap 사이즈를 늘리니깐 정상 동작했을까 ?

해결 방법

일단 OOM 이 왜 발생하는지 알아보자

자바는 Garbase Collection 이라는 메모리 관리 방식을 채택하고 있는데, 이는 사용자가 메모리에 관심을 가지지 않게 해주지만 때로는 메모리 누수(Memory Leak) 에 관심을 가져야 한다

메모리 누수(Memory Leak) 란 ?
Garbage Collection 되어야 할 메모리가 정리되지 못하고 계속 Java 메모리 공간에 남아 있는 현상을 말한다. 메모리 누수가 계속 되면 결국 Out Of Memory 현상이 발생하고, 어플리케이션이 더이상 동작하지 못하고 JVM 이 종료되게 된다.

static 같은 정적 메모리로 선언되어 있다면 메모리에서 지워지지 않고 계속 남아 있기 때문에 OOM 이 발생하게 된것이다.

메모리 설정
-Xms : Java 힙의 초기 크기를 설정
-Xmx : Java 힙의 최대 크기를 설정

레퍼런스

[카카오 면접] Java Out Of Memory ( OOM )

0개의 댓글