JVM 메모리 관리와 GC, 객체 동작 핵심 정리
1. 세대 단위 컬렉션(Generational Collection) 이론
- 약한 세대 가설(Weak Generational Hypothesis)
→ 대부분의 객체는 일찍 사라진다. (지역 스코프 변수, 임시 객체 등) - Age bit
→ Young 영역(Survivor space)에 있는 동안 살아남을 때마다 age 값 증가.
→ age 값이 일정 이상이면 Old 영역으로 승격(Promotion). - 세대 간 참조 가설
→ 서로 다른 세대 간의 참조는 드물고, 같은 세대 내에서 참조가 많다.
Survivor 영역이 2개인 이유
- GC 후 남은 객체를 압축(Compaction) 하여 파편화를 막고, 효율적으로 재배치하기 위함.
- Eden → Survivor0 → Survivor1 식으로 교체하면서 객체를 정리.
- mark-sweep-compact
2. GC 기본 메커니즘
- Mark and Sweep
- Mark: 루트에서부터 도달 가능한 객체 표시.
- Sweep: 마크되지 않은 객체 제거.
- 도달 가능성 분석(Reachability Analysis)
GC Root로부터 도달 가능한지 여부로 생존 판정.
GC Root의 예시
- JVM 스택의 지역변수 테이블에서 참조하는 객체
- synchronized 로 잠긴 모니터 객체
- JNI에서 참조하는 객체
- 클래스의 static 필드에서 참조하는 객체
- 클래스의 static final 상수에서 참조하는 객체
- JVM 내부에서 사용 중인 객체
📌 주의:
정적 필드가 다른 객체를 참조하면 그 객체는 GC 되지 않을 수 있다.
3. GC 종류와 발생 조건
- Minor GC: Young 영역(Eden+Survivor)이 가득 찼을 때 발생.
- Major GC: Old 영역이 가득 찼을 때 발생.
- Full GC: Old 영역 또는 Metaspace가 가득 찼을 때 발생.
- G1GC:
- 세대 구분이 아니라 힙 전체를 Region 단위로 나눔.
- 수집 효율이 좋은 영역부터 회수.
- 대용량 힙에서 지연시간을 줄이기 위한 목적.
4. GC 튜닝 포인트
- 서비스 특성에 맞게 Young/Old/Metaspace 크기 조정.
- Minor/Full GC 발생 빈도를 모니터링하고 조율.
- 필요시 GC 알고리즘(Parallel, CMS, G1 등) 변경 고려.
5. 객체 구성 (JOL: Java Object Layout)
- Object Header
- Mark Word: 해시코드, age, lock flag 등 저장.
- Klass Word: Metaspace의 클래스 메타데이터 참조.
- Length: 배열일 경우 길이 저장.
- Instance Data: 실제 필드 값.
- Padding: 정렬을 위한 여유 공간.
6. 락과 동기화
- Lock flag 와 상태 정보는 Mark Word에 저장됨.
- 동기화 방식:
- 스핀락(Spin Lock): CPU 반복 대기로 처리, 경량(lock 경쟁이 짧을 때).
- 뮤텍스(Mutex): OS 커널 수준 락, 무겁지만 안정적.
7. HashCode 부여 시점
- 객체 생성 시점에는 아직 해시코드가 부여되지 않음.
- .hashCode() 호출 시점에 JVM이 생성하여 Mark Word에 저장.
8. 동등성과 동일성
- 동일성(Identity): 참조가 같은 객체를 가리키는지 (==).
- 동등성(Equality): 객체의 내용이 같은지 (equals).
- 컬렉션, String 등은 equals/hashCode 가 이미 재정의되어 있음.
- 커스텀 객체에서 동등성 비교를 하려면 equals와 hashCode 반드시 재정의.
- Lombok을 쓰면 자동으로 재정의 가능.
'자바 > 자바' 카테고리의 다른 글
| [Java] I/O 스트림과 안전한 자원 관리: Try-with-Resources 완벽 분석 (Try-Catch-Finally 비교) (0) | 2025.12.04 |
|---|---|
| (JAVA) 함수형 인터페이스 완벽 정리: 람다부터 스트림까지의 연결고리 (0) | 2025.12.03 |
| (자바)JVM, 클래스 로딩, 런타임 메모리 구조 정리 *널널한 개발자 (0) | 2025.09.09 |
| (자바) 자바 상속, 다형성, 추상화 *널널한 개발자 (0) | 2025.09.08 |
| (자바) 상속 정리 *인프런_널널한 개발자 (0) | 2025.09.08 |