규칙 6. 유효기간이 지난 객체 참조는 폐기하라

GC가 메모리 관리를 알아서 해주면 메모리관리의 중요성을 잊게 될 수도 있는데 그러지 말자

만기참조를 없애라

더이상 참조되지 않는 만기참조의 경우 제거해주지 않으면 의도치 않은 객체 보유문제(실수로 객체 참조를 계속 유지하는 경우 해당 객체만 쓰레기 수진에서 제외되는것이 아니라 그객체를 통해 참조되는 다른 객체들도 쓰레기 수집에서 제외되는것)를 유발할 수 있다.
이러한 문제는 쓸일이 없는 참조객체의 경우 null로 만들어 주는것으로 해결 가능하다.

null처리에 대한 강박관념은 좋지않다.

객체 사용이 끝나면 null처리를 해야된다는 강박관념에 사로잡히면 코드를 난잡하게 만들 수 있다. 그러므로 이는 규범이라기 보다는 예외적인 조치가 되어야 한다. 만기참조를 제거하는 가장 좋은 방법은참조가 보관된 변수가 유효범위(scope)를 벗어나게 두는 것이다. 즉 변수를 정의 할 때 유효범위를 좁게 만들면 자연스럽게 해결된다.

메모리 누수가 자주 일어나는곳들

1.캐시
객체 참조를 캐시 안에 넣어놓고 일어버리는 일이 많기 때문.
WeakHashMap을 가지고 캐시를 구현하면 키에대한 참조가 만기 참조가 되는 순간 캐시안에 보관된 키-값 쌍은 자동으로 삭제된다.

2.리스너 등의 역호출자(Callback)
역호출자를 명시적으로 제거하지 않을 경우, 적절한 조치를 취하기 전까지 메모리는 점유된 상태로 남아있게된다. gc가 역호출자를 즉시 처리하게 하려면 역호출자에 대한 약한참조만 저장하는것! WeakHashMap의 키로 저장하는것이 그 예이다.

WeakHashMap?

http://blog.breakingthat.com/2018/08/26/java-collection-map-weakhashmap/ 참고하자

Share