좋은 질문입니다! 자바에서 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 대체 전략이 중요함.




LIST

+ Recent posts