힙은 남았는데 서비스가 멈췄다 · 힙 덤프에서 범인을 찾는다 · 퀴즈
퀴즈: 힙 덤프와 재발 방지
문항 6개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
-XX:+HeapDumpOnOutOfMemoryError 에 대해 java 명령 문서가 적은 것은?
- OutOfMemoryError 가 던져질 때 HPROF 덤프를 만들며 기본은 꺼져 있다
- 기본으로 켜져 있어 늘 java_pid.hprof 가 생긴다
- GC 가 돌 때마다 힙을 파일로 남긴다
- 덤프 대신 클래스 히스토그램을 로그에 찍는다
OutOfMemoryError 가 난 뒤에도 프로세스가 살아서 헬스체크를 통과하는 상태를 끝내는 옵션은?
- -XX:+UseSerialGC
- -XX:+ExitOnOutOfMemoryError — 첫 OOM 에서 종료 코드 3 으로 끝난다
- -Xlog:gc* — 정지가 기록되면 종료한다
- -XX:MaxRAMPercentage=100
jcmd 문서에서 GC.heap_dump 가 -all 없이 하는 일은?
- 도달 불가능한 객체까지 전부 덤프한다
- 덤프 전에 JVM 을 정지시키고 다시 시작한다
- 먼저 Full GC 를 요청해 도달 가능한 객체만 남긴다
- 히스토그램만 만들고 파일은 만들지 않는다
클래스 히스토그램 1위가 `[B` 수백만 개다. 다음 질문은?
- byte 배열을 쓰지 않도록 코드를 고친다
- -Xmx 를 두 배로 올린다
- [B 의 인스턴스 수를 줄이는 GC 옵션을 찾는다
- 누가 그 배열들을 붙들고 있는가 — 덤프의 지배 트리에서 static 컬렉션을 찾는다
메모리 한도 2Gi 파드에서 -Xmx 없이 띄운 JVM 의 기본 최대 힙과, 그것을 1GiB 로 만드는 옵션은?
- 2GiB, -Xms1g
- 512MiB, -XX:MaxRAMPercentage=50
- 1GiB, 아무것도 안 해도 된다
- 256MiB, -XX:InitialRAMPercentage=50
힙을 컨테이너 한도에 거의 붙여 잡았더니 OutOfMemoryError 도 덤프도 없이 파드가 죽었다. 무슨 일인가?
- 힙 밖 메모리(메타스페이스·스택·직접 버퍼)까지 합쳐 한도를 넘어 OOMKilled 된 것이다
- HeapDumpPath 가 없어 JVM 이 스스로 종료한 것이다
- G1 이 큰 힙에서 정지를 포기하고 프로세스를 끝낸 것이다
- ExitOnOutOfMemoryError 가 기본으로 켜져 있기 때문이다