홈 › 고급 › 10 / 10

JVM 메모리·GC·OOM 진단

힙은 어떻게 생겼고, 무엇이 남고, 터지면 어디를 보는가
섹션 7진행 0 / 10

JVM 메모리·GC·OOM 진단: 힙은 어떻게 생겼고, 무엇이 남고, 터지면 어디를 보는가

운영 서버가 새벽에 OutOfMemoryError 로 죽었습니다. 로그에는 마지막 GC 가 62M→62M 이었다는 한 줄뿐입니다. 이 레슨은 그 한 줄을 읽는 법부터 시작합니다. 힙의 구조, 객체가 살아남는 조건, GC 종류별 특성, 힙 덤프를 받는 옵션까지 전부 실행으로 확인합니다. OOM 은 자식 JVM 을 띄워 안전하게 재현합니다.

1. 왜 배우는가

메모리 문제는 재현이 어렵습니다. 개발 PC 에서는 멀쩡하고 운영에서 며칠 뒤에 터집니다. 원인은 대개 "누군가 참조를 놓지 않은 것" 인데, 그것을 찾으려면 힙 덤프를 읽어야 하고, 힙 덤프를 읽으려면 객체가 힙에서 어떻게 생겼는지 알아야 합니다.

GC 옵션은 외워서 쓰는 것이 아닙니다. 서버 코어 수, 힙 크기, 응답 시간 목표에 따라 답이 다릅니다. Serial·Parallel·G1·ZGC 를 같은 작업으로 돌려 보면 각각 무엇을 포기하고 무엇을 얻는지 숫자로 보입니다.

-Xmx, -Xlog:gc, -XX:+HeapDumpOnOutOfMemoryError 세 옵션은 모든 운영 JVM 에 붙어 있어야 합니다. 왜 그런지가 이 레슨의 결론입니다.