이펙티브 자바 2장 Item7를 요약한 내용입니다.
자바처럼 가비지 컬렉터를 갖춘 언어는 메모리 관리에 신경쓸 일이 줄어든다.
하지만 다 쓴 객체의 참조를 해제하지 않는 경우 메모리 누수가 발생할 수 있다.
다 쓴 참조(obsolete reference)란 앞으로 다시 쓰지 않을 참조라는 뜻이다.
다 쓴 참조라도 그 객체를 참조하는 객체가 존재한다면 가비지컬렉터가 회수해가지 못한다.
다 쓴 참조를 해제하는 가장 좋은 방법은 참조를 담은 변수를 유효 범위 밖으로 밀어내는 것이다
이것은 변수의 범위를 최소가 되게 정의하면 자연스럽게 이루어진다.
스스로 메모리를 관리하는 클래스는 사용하지 않는 참조를 null처리하여 가비지 컬렉터에게 해당 객체는 더이상 사용하지 않을 것임을 알려야 한다.
객체 참조를 캐시에 넣어두고 까먹으면 그 객체는 영영 수거되지 못한다.
보통 시간이 지날수록 캐시 엔트리의 가치를 떨어뜨리고 일정 시간마다 가치가 낮은 엔트리를 청소하는 방식으로 메모리 누수를 막는다.
캐시 외부에서 키를 참조하는 동안만 엔트리가 살아있는 캐시가 필요한 상황이라면 WeakHashMap을 사용한다.
클라이언트가 콜백을 등록만하고 해지하지 않으면 콜백은 계속 쌓여만 간다.
이때 콜백을 약한참조(weak reference)로 저장하면 가비지 컬렉터가 즉시 수거해 간다.
메모리 누수는 겉으로 드러나지 않기 때문에 수년간 잠복하기도 한다.
이러한 누수를 막기 위해 철저한 코드 리뷰나 힙 프로파일러같은 디버깅 도구를 사용한다.
또한 메모리 누수를 예방하기 위한 노력이 중요하다.
[이펙티브 자바] Item 9. try-finally 보다 try-with-resources를 사용하라 | 2장 (0) | 2023.04.12 |
---|---|
[이펙티브 자바] Item 8. finalizer와 cleaner 사용을 피하라 | 2장 (0) | 2023.04.12 |
[이펙티브 자바] Item 6. 불필요한 객체 생성을 피하라 | 2장 (0) | 2023.04.05 |
[이펙티브 자바] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 | 2장 (0) | 2023.04.05 |
[이펙티브 자바] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 | 2장 (0) | 2023.03.29 |