좋은 질문입니다! 자바에서 Humongous Object(거대한 객체) 는 Garbage-First (G1) GC를 사용할 때 특히 중요한 개념입니다. G1 GC는 Java 7부터 도입된 GC 알고리즘으로, 대규모 힙에서 예측 가능한 GC 성능을 제공하는 것이 목표입니다.
---
✅ Humongous Object란?
G1 GC에서 특정 크기 이상의 큰 객체는 일반적인 Eden/Survivor/Old 영역에 저장되지 않고, Humongous 영역에 별도로 할당됩니다.
일반적으로 G1 GC에서 Region size의 50%를 초과하는 객체가 여기에 해당합니다.
---
✅ G1 GC 메모리 구조 요약
전체 힙은 고정 크기의 Region들로 나뉩니다 (예: 1MB씩).
G1 GC는 힙을 Eden, Survivor, Old로 나누고 각 영역은 여러 Region으로 구성됨.
객체가 Region 하나에 못 들어갈 정도로 크면, 여러 Region을 묶어서 할당함 → 이것이 Humongous 객체.
---
✅ Humongous Object의 처리 방식
1. Humongous Threshold
Region size의 50% 초과 객체: 예) Region이 1MB면 512KB 초과 → Humongous 취급
2. 연속된 Region에 할당
예: 3MB 객체면 최소 3개의 연속된 Region이 필요함.
3. Old 영역에 직접 할당
Eden이 아닌 Old 영역에 바로 들어감 (GC 주기를 우회함).
4. GC 시 복잡성 증가
크고 이동이 힘들기 때문에 Full GC의 성능 저하 원인이 되기도 함.
5. Cleanup Phase에서 회수
G1은 Humongous 영역을 GC의 Cleanup Phase에서 특별히 처리함.
---
✅ Humongous Object 관련 고려사항
항목 설명
성능 문제 큰 객체가 자주 생성되면 GC 성능 악화 (특히 Full GC)
회피 전략 ByteBuffer 등은 off-heap 사용을 고려
튜닝 가능 -XX:G1HeapRegionSize 및 -XX:G1HeapWastePercent 등으로 조정 가능
진단 도구 jmap, gc logs, VisualVM, jcmd 명령어로 분석 가능
---
✅ 실전 예시
byte[] bigArray = new byte[2 * 1024 * 1024]; // 2MB 객체, Region 1MB 기준으로 Humongous
이런 객체는 G1 GC에서 Humongous 영역에 2개의 연속된 Region으로 할당됩니다.
---
✅ 결론 요약
Humongous Object는 G1 GC에서 Region의 50% 초과하는 객체.
여러 Region을 묶어 Old 영역에 직접 할당됨.
GC에 부담이 크기 때문에 생성을 줄이거나 off-heap 대체 전략이 중요함.
'Spring & Backend' 카테고리의 다른 글
| Infrastructure as Code(IaC)에 대해 설명해 주세요. (0) | 2025.07.08 |
|---|---|
| 네트워크에서 회선 교환 방식과 패킷 교환 방식은 어떤 차이점 있나요? (0) | 2025.07.04 |
| 백엔드 캐시 전략 (2) | 2025.07.02 |
| Micrometer가 무엇인지 설명해주세요. (0) | 2025.07.02 |
| 시간 복잡도와 공간 복잡도의 차이점은 무엇인가요? (0) | 2025.07.01 |
