JVM 애플리케이션에서 자주 발생하는
힙 메모리 부족(OutOfMemoryError)과 메모리 누수(Leak) 문제의 원인과 진단 방법,
그리고 이를 해결하기 위한 전략들을 정리하였다.
1. Heap 메모리 부족의 원인
| 원인 | 설명 |
|---|---|
| 객체 과다 생성 | GC가 회수하지 못할 정도로 객체가 계속 생성됨 |
| 지속적인 참조 유지 | 사용 후에도 객체가 컬렉션 등에 남아 GC 대상이 아님 |
| 캐시 과다 | LRU 없이 무한정 쌓이는 Map, 리스트 등 |
| 이벤트 리스너 누락 | 제거되지 않은 Listener로 인해 참조가 유지됨 |
2. 진단 방법
✅ GC 로그 확인
-Xlog:gc옵션으로 GC 빈도, 정지 시간 확인- Full GC가 반복된다면 Old 영역 포화 가능성
✅ Heap Dump 분석
jmap -dump:format=b,file=heap.hprof <PID>- Eclipse MAT, VisualVM 등으로 힙 덤프 열람
- Dominator Tree, Reference Chain 분석으로 누수 경로 추적
✅ OutOfMemoryError 메시지 확인
GC overhead limit exceeded: GC만 하고 있음Java heap space: Heap 크기 초과Metaspace: 클래스 수 과다, 리플렉션 등으로 발생 가능
3. 해결 전략
✔️ 불필요한 객체 참조 제거
- 컬렉션 초기화, listener 제거 등
✔️ 캐시 관리 전략
- LRU 기반 캐시 사용 (e.g. Guava Cache)
- TTL(Time-To-Live) 설정 적용
✔️ WeakReference 활용
- 강한 참조 대신 약한 참조로 GC 허용
- Soft/Weak/Phantom Reference 차이 이해 필요
✔️ 힙 크기 조절
-Xmx값을 점진적으로 증가- 하지만 근본 원인은 코드/설계 개선
학습 정리
Heap 메모리 부족이나 메모리 누수는 대부분 코드 설계나 자원 해제 실수에서 비롯된다.
진단 도구를 활용한 힙 분석과 GC 로그 해석은 문제 해결의 첫걸음이며,
특히 서버 애플리케이션의 안정성과 직결되기 때문에 사전 설계와 정기 모니터링이 중요하다.
'CS공부 > Java & Spring' 카테고리의 다른 글
| Spring 내부 구조 - DispatcherServlet, 요청 흐름, 에러 처리 (0) | 2025.04.22 |
|---|---|
| Spring Boot @Transactional 어노테이션 (0) | 2025.04.22 |
| Spring Boot 프로젝트 horong 리팩토링 (1) | 2025.04.22 |
| 가비지 컬렉션(Garbage Collection) (0) | 2025.04.21 |
| JVM과 힙, 스택 (0) | 2025.04.21 |