728x90
heap 영역에 할당된 객체 중 필요 없어진 것을 메모리에서 해제하는 것
필요 없어진 객체란 정확히 무엇을 의미하는가?
//for문이 1번 반복될 때마다 이전 NewObject 객체는 참조를 상실하게 된다.
NewObject obj;
for (int i = 0; i < 2; i++) {
obj = new NewObject();
obj.doSomething();
}
int a = 45;
a = 46;
→ for문이 1번 반복될 때마다 heap 영역 바깥으로의 도달 능력(reachability)을 상실한 객체가 생겨난다.
식별한 제거 대상 객체를 어떻게 제거하는가?
Mark and Sweep: 총 3단계로 이루어져 있다.
Mark → 전역변수, 현재 스택의 지역변수로부터 연결된 참조 변수들을 찾아내어 마킹
Sweep → 마킹되지 않은 객체들을 heap에서 제거
Compaction → 파편화된 객체들을 다시 정리
꼬리 질문 1:
왜 Compaction 과정을 거치는가?
꼬리 답변 1:
→ mark & sweep을 하고 나면 heap 영역 내부는 잘게 파편화된다. 이때 크기가 10인 객체를 heap에 할당하고 싶은데 남은 공간은 2, 3, 7, 1… 이렇게 되어있으면 할당을 하고 싶어도 할 수가 없기 때문이다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
| [Java]try-catch 제대로 이해하기 (0) | 2025.05.28 |
|---|---|
| [Java]extends vs implements: 단일 vs 다중 상속 (0) | 2025.05.28 |
| 객체가 같다는 것은 정확히 어떤 의미인가? (0) | 2025.05.28 |