어느날 ... 오류 slack 알림 봇 에서 엄청나게 많은 java.lang.OutOfMemoryError: GC overhead limit exceeded
에러가 떨어지기 시작했다.
배포 나간 것도 없는데 왜 그러는겨 🤔
정말 울고 싶었지만 ,,, 그럴 시간도 없었다.
일단 우선순위를 시스템 안정화로 두고,
를 하고 나니 응답 시간이 많이 줄어 들었고, 오류가 발생하지 않기 시작했다.
잠깐 한숨을 돌리려는 순간 ! 다시 오류가 나기 시작했다. 🤯
눈물 흘릴 준비를 하고 있던 그때 다른 개발자 분이 최대 힙 메모리를 늘려야 한다고 말씀을 해주셨다.
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 힙의 최대 크기를 설정