본문 바로가기
프로그래밍 언어/Java

Garbage collection

by seongjko 2025. 5. 28.
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… 이렇게 되어있으면 할당을 하고 싶어도 할 수가 없기 때문이다.