IT 관련 책 정리 및 후기/Java Effective E3

[Item 7] 다 쓴 객체 참조를 해제하라

JUN0126 2022. 5. 19. 01:33

가비지 컬렉션 (GC)

 - 다 쓴 객체(사용하지 않는 객체)를 알아서 회수해 가는 자바 메모리 관리 기능

 

 

가비지 컬렉션이 객체를 회수하지 못하는 경우

 - 참조된 객체가 하나라도 있다면 해당 객체 뿐만 아니라 그 객체가 참조하는 모든 객체는 회수 될 수 없다

 그래서 단 몇개의 객체가 매우 많은 객체를 회수하지 못하게 할 수 있고 잠재적으로 성능에 악영향을 줄 수 있다.

 

해결방안

 1. 해당 참조를 다 사용하였을 떄 null 처리(참조 해제) 하면 된다.

  - 프로그래머는 비활성 영역이 되는 순간 null 처리를 해서 해당 객체는 더이상 쓰이지 않을 것임을 가비지 컬렉션에

    알려야 한다.

  -> 실수로 null 처리한 참조를 사용하게 된다면 프로그램은 NullPointerException 예외를 발생시켜 종료된다.

 

2. 참조를 담은 변수를 유효 범위(scope) 밖으로 밀어낸다 

 

 

메모리 누수 원인

 1. 캐시

  - 객체 참조를 캐시에 넣고 나서, 이 사실을 잊은 채 그 객체를 다 쓴 뒤로도 한참을 그냥 놨두는 경우

   -> WeakHashMap을 사용하여 캐시를 만들면 다 쓴 엔트리는 자동으로 제거됨, 이러한 캐시 상황에서만 사용

 

 2. 리스너 혹은 콜백

  - 클라이언트가 콜백을 등록만 하고 명확히 해지하지 않는다면, 콜백은 계속 쌓여 나간다.

   -> 콜백을 약한 참조로 저장하면 가비지 컬렉터가 즉시 수거한다. EX) WeakHashMap에 키로 저장

 

 

메모리 누수는 겉으로 드러나지 않아 시스템에 잠복하는 경우가 많다.

이러한 문제는 예방법을 익혀두어 관리해야 한다.

 

참조된 ITEM

 - 변수 범위 최소 정의 [ITEM 57]