본문 바로가기

cs(with 매일메일)

[251205금] JVM에서 GC대상 객체를 판단하는 기준은 무엇인가요?

GC(Gerbage Collection)는 자바의 메모리 관리 방법의 하나이며, JVM의 힙 영역에서 동적으로 할당했던 메모리 중에서 필요 없어진 객체를 주기적으로 제거하는 것을 의미한다. 

GC는 특정 객체가 사용 중인지 아닌지 판단하기 위해서 도달 가능성(Rechability)라는 개념을 사용한다. 

니는 특정 객체에 대한 참조가 존재하면 도달할 수 있으며, 참조가 존재하지 않는 경우는 도달할 수 없는 상태로 간주한다. 

이때 도달할 수 없다는 결론을 내린다면 해당 객체는 GC의 대상이 된다. 

 

Q. 도달 가능성은 어떻게 판단하나요?

힙 영역에 있는 객체에 대한 참조는 4가지 케이스가 존재한다. 힙 내부 객체 간의 참조 / 스택 영역의 변수에 의한 참조 / JNI에 의해 생성된 객체에 대한 참조(네이티브 영역) / 메서드 영역의 정적(static) 변수에 의한 참조이다. 

이때 힙 내부 객체 간의 참조를 제외한 나머지를 Root Set이라고 한다. Root Set으로 시작한 참조 사슬에 속한 객체들은 도달할 수 있는 객체이며, 이 참조 사슬과 무관한 객체들은 도달하지 어렵기 때문에 GC 대상이 된다. 

 

Q. 개발자가 GC대상 판단에 관여할 수는 없나요? 

자바에서는 java.lang.ref패키지의 SoftReference, WeakReference 클래스를 통해 개발자가 GC 대상 판단에 일정 부분 관여할 수 있다. 해당 클래스들의 객체는 원본 객체를 감싸서 생성한다. 이렇데 생성된 객체는 GC가 특별하게 취급한다.