반응형

JVM 5

java.lang.OutOfMemoryError: Java heap space - 원인 진단부터 해결까지

java.lang.OutOfMemoryError: Java heap space - 원인 진단부터 해결까지서비스가 잘 돌아가다가 어느 순간 응답이 뚝 끊기고, 로그를 열어보면 java.lang.OutOfMemoryError: Java heap space 한 줄이 딱 찍혀 있는 상황, 백엔드 개발자라면 한 번씩은 다 겪어보셨을 거예요. 저도 신입 때 이 로그를 처음 봤을 때 "힙이 뭐길래 터졌다는 거지?" 하고 무작정 -Xmx부터 늘려서 잠깐 넘긴 적이 있는데요, 며칠 뒤 똑같이 터지고 나서야 근본 원인을 찾아야 한다는 걸 알았습니다. 오늘은 이 에러가 정확히 뭘 의미하고, 어떻게 원인을 찾아서 진짜로 해결하는지 정리해 볼게요.개념 / 원리java.lang.OutOfMemoryError: Java heap ..

IT·리눅스/Java 2026.07.05

[Java] JVM 메모리 누수 - 원인과 진단 도구 한 번에 정리

[Java] JVM 메모리 누수 - 원인과 진단 도구 한 번에 정리운영 중인 자바 서버가 며칠에 한 번씩 OOM으로 죽어서 새벽마다 알람이 울린 적이 있습니다. 처음엔 그냥 힙을 늘렸어요. 6GB → 8GB → 12GB. 그런데 결국 또 터지더라고요. GC 로그를 보니 Full GC가 분 단위로 돌면서도 Old 영역이 90% 아래로 안 떨어지는 패턴이 반복되고 있었습니다. 그제서야 "아, 이건 누수구나" 싶었죠. 자바는 GC가 알아서 청소해 주니까 누수가 없을 거라고 생각하기 쉬운데, 실은 자바 개발자라면 한 번쯤은 꼭 마주치는 문제입니다. 오늘은 지난 G1 GC 글에 이어서, JVM 메모리 누수가 왜 생기는지 그리고 힙 덤프부터 MAT까지 어떻게 추적하는지 한 번에 정리해 볼게요.개념 / 원리자바의 G..

IT·리눅스/Java 2026.05.12

[Java] G1 GC 내부 동작 - Region과 Garbage First의 정체

지난 글에서 G1 GC를 "구역별로 더러운 곳부터 치우는 청소부"에 비유했었는데요, 사실 그 한 줄이 G1의 정체를 거의 다 말해줍니다. 그런데 옵션 한 줄(-XX:+UseG1GC)로 켜고 끝내는 분들을 보면 안타까운 게, Region이 정확히 뭔지, 왜 "가비지 퍼스트"라고 부르는지를 모르면 GC 로그가 외계어로 보이거든요. 저도 처음엔 로그에 Mixed GC라는 단어가 자꾸 떠서 한참을 검색했던 기억이 있습니다. 오늘은 그 G1의 속을 한 칸 더 들여다보면서, 옵션을 어떤 근거로 만지는지까지 정리해 볼게요.개념 / 원리G1의 모든 비밀은 Heap을 잘게 쪼갠다는 한 줄로 시작합니다. 기존 GC가 Heap을 Young/Old처럼 큰 덩어리로 보던 것과 달리, G1은 같은 크기의 작은 Region으로 나..

IT·리눅스/Java 2026.05.11

[Java] GC의 종류 - Serial / Parallel / G1 / ZGC 비교

운영 중인 자바 서비스의 응답시간 그래프를 보다가, 평소엔 잘 나오다 가끔 1~2초씩 툭 튀는 구간을 보신 적 있으실 거예요. 거의 다 GC가 STW(Stop-The-World)로 잠깐 세상을 멈춘 흔적입니다. 그래프가 어떻게 튀는지는 어떤 GC를 쓰느냐에 따라 패턴이 완전히 달라지고요. 저도 옛날에 옵션 한 줄을 -XX:+UseG1GC로 바꾸고 응답시간 99분위가 1초에서 200ms로 떨어지는 걸 보고 GC 옵션의 무서움을 실감했습니다. 지난 글에서 JVM 메모리 구조를 정리했으니, 오늘은 그 Heap을 청소하는 GC 네 종류를 한 자리에서 비교해 볼게요.개념 / 원리GC가 하는 일은 결국 "Heap에서 안 쓰는 객체 치우기" 한 가지인데, 어떻게 치우느냐에 따라 네 가지로 갈립니다. 핵심 트레이드오프..

IT·리눅스/Java 2026.05.08

[Java] JVM 메모리 구조 - Heap, Stack, Metaspace 한 번에 잡기

자바 애플리케이션이 운영 환경에서 갑자기 OOM(OutOfMemoryError)으로 죽었다는 알람을 받아본 적, 한 번쯤은 있으실 겁니다. 새벽에 폰 알람에 깨서 로그를 보면 어떤 날은 Java heap space, 어떤 날은 Metaspace, 어떤 날은 unable to create new native thread인데, 정작 그게 무슨 차이인지 헷갈려서 일단 -Xmx만 늘려놓고 다시 잠드신 적도 있으실 거예요. 저도 그랬습니다. 오늘은 그 OOM 메시지 한 줄을 제대로 읽어내기 위한 출발점, JVM 메모리 구조를 한 번에 정리해 볼게요.개념 / 원리JVM은 시작할 때 OS로부터 일정량의 메모리를 받아서, 자기만의 규칙대로 영역을 쪼갭니다. 크게 다섯 군데인데, 이름만 들으면 헷갈리지만 역할은 의외로 ..

IT·리눅스/Java 2026.05.07