가비지 컬렉션 (GC)
- 다 쓴 객체(사용하지 않는 객체)를 알아서 회수해 가는 자바 메모리 관리 기능
가비지 컬렉션이 객체를 회수하지 못하는 경우
- 참조된 객체가 하나라도 있다면 해당 객체 뿐만 아니라 그 객체가 참조하는 모든 객체는 회수 될 수 없다
그래서 단 몇개의 객체가 매우 많은 객체를 회수하지 못하게 할 수 있고 잠재적으로 성능에 악영향을 줄 수 있다.
해결방안
1. 해당 참조를 다 사용하였을 떄 null 처리(참조 해제) 하면 된다.
- 프로그래머는 비활성 영역이 되는 순간 null 처리를 해서 해당 객체는 더이상 쓰이지 않을 것임을 가비지 컬렉션에
알려야 한다.
-> 실수로 null 처리한 참조를 사용하게 된다면 프로그램은 NullPointerException 예외를 발생시켜 종료된다.
2. 참조를 담은 변수를 유효 범위(scope) 밖으로 밀어낸다
메모리 누수 원인
1. 캐시
- 객체 참조를 캐시에 넣고 나서, 이 사실을 잊은 채 그 객체를 다 쓴 뒤로도 한참을 그냥 놨두는 경우
-> WeakHashMap을 사용하여 캐시를 만들면 다 쓴 엔트리는 자동으로 제거됨, 이러한 캐시 상황에서만 사용
2. 리스너 혹은 콜백
- 클라이언트가 콜백을 등록만 하고 명확히 해지하지 않는다면, 콜백은 계속 쌓여 나간다.
-> 콜백을 약한 참조로 저장하면 가비지 컬렉터가 즉시 수거한다. EX) WeakHashMap에 키로 저장
메모리 누수는 겉으로 드러나지 않아 시스템에 잠복하는 경우가 많다.
이러한 문제는 예방법을 익혀두어 관리해야 한다.
참조된 ITEM
- 변수 범위 최소 정의 [ITEM 57]
'IT 관련 책 정리 및 후기 > Java Effective E3' 카테고리의 다른 글
[Item 9] try-finally보다는 try-with-resources를 사용하라 (0) | 2022.05.21 |
---|---|
[Item 8] finalizer와 cleaner 사용을 피하라 (0) | 2022.05.19 |
[ITEM 6] 불필요한 객체 생성을 피해라 (0) | 2022.05.19 |
[ITEM 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2022.05.17 |
[ITEM 4] 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2022.05.17 |