Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
TIL Misson (2)
by jhun
#pragmatic
2년 전
564

💡 연습문제 18.

일부 자바 개발자들은 어떤 객체를 사용한 다음에 반드시 그 객체를 가리켰던 변수를 NULL로 설정한다. 왜 이것이 좋은 생각일까?

✅ 풀이 과정

SoftReference, WeakReference, PhantomReference 3가지 클래스에 의해 생성된 객체를 reference object 라고 합니다.

하나의 객체는 여러 reference 조합으로 참조될 수 있습니다. reference 타입 구분은 root set으로 부터를 기준으로 합니다.

  • strongly reachable: root set으로부터 시작해서 객체까지 도달하는 여러 참조 사슬 중 reference object가 아닌 참조가 하나라도 있는 객체

  • softly reachable: strongly reachable 이 아닌 객체 중에서(Strong Reference가 없는) weak reference, phantom reference 없이 soft reference만 통과하는 참조 사슬이 하나라도 있는 객체

  • weakly reachable: strongly reachable, softly reachable이 아닌 객체 중에서, phantom reference 없이 weak reference만 통과하는 참조가 하나라도 있는 객체

  • phantomly reachable: strongly reachable, softly reachable, weakly reachable 모두 해당되지 않는 객체. 이 객체는 파이널라이즈(finalize)되었지만 아직 메모리가 회수되지 않은 상태

  • unreachable: root set으로부터 시작되는 참조 사슬로 참조되지 않는 객체

GC 과정

GC 대상 객체를 찾는 작업 -> GC 대상 객체를 처리(파이널라이즈) -> 할당된 메모리를 회수

연속된 작업은 아님

ReferenceQueue

어떤 객체가 더 이상 필요없게 되었을 때 관련 후처리를 해야할 경우 유용하게 사용할 수 있음

  • GC가 수행될때마다 회수 대상 (실제 GC 알고리즘에 따라 반드시 회수된다고 보장할 수 없음)

  • 짧은 주기에 자주 사용되는 객체를 캐시할 때 유용

  • 객체 생성시 RefereceQueue를 생성자 인자로 넘기냐에 따라 사용유무가 정해집니다.

  • 객체 내부의 참조가 null로 설정된 후 ReferenceQueue에 enqueue

  • => 이 과정은 GC에 의해 자동으로 수행됨

✅ 참고 링크

Naver D2 - Java Reference와 GC

https://d2.naver.com/helloworld/329631

💡 책에 있는 해답

변수를 NULL로 설정하면 그 변수가 가리키던 객체를 가리키는 포인터의 수가 하나 줄어든다. 포인트 개수가 0이 되면 그 객체는 가비지 컬렉션 대상이 된다. 실행 시간이 길어서 메모리 사용량 시간이 지남에 따라 늘어나지 않도록 신경 써야 하는 프로그램이라면 변수에 NULL을 설정하는 것이 중요할 수 있다.