본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
Java에서의 메모리 관리
- Java에 GC가 존재하긴 하지만, 메모리 누수가 발생할 수 있으므로 메모리 관리에 신경써야 한다
- 책의 예시에선 스택이 다 쓴 참조를 여전히 가지고 있는 예시를 보여주고 있다
- 활성 영역 <-> 비활성 영역(다 쓴 참조들의 집합)
- 다 쓴 참조(obsolete reference)란? -> 앞으로 다시 쓰지 않을 참조들
- 객체 참조 하나를 살려두면 연속적으로 다른 객체들이 회수되지 못하는 현상이 발생할 수 있다 -> 성능에 큰 악영향
- 따라서 사용이 끝나는 참조는 null 처리하여 참조를 해제해줘야 한다
- 활성 영역 <-> 비활성 영역(다 쓴 참조들의 집합)
- 참조 해제는 몇 가지 장점을 지닌다
- null 처리한 참조를 사용하려 하면 NPE를 throw하는 방식으로 프로그램을 작성할 수 있다
- 오류는 가능한 한 조기에 발견하는 게 좋다는 원칙에 의거한다
- null 처리한 참조를 사용하려 하면 NPE를 throw하는 방식으로 프로그램을 작성할 수 있다
- 모든 객체를 null처리할 필요는 없다
- 이러한 행위는 프로그램의 가독성을 떨어뜨릴 수 있다
- 객체 참조를 null 처리하는 일은 예외적인 경우로 제한한다
- 이상적으로 다 쓴 참조를 해제하는 방법은 그 참조를 담은 변수를 유효 범위(scope) 밖으로 밀어내는 것이다
- 변수의 범위를 좁게 설정하면 이는 자연스럽게 이루어진다
- 즉, 지역변수와 매개변수를 활용하면 자연스럽게 참조를 해제할 수 있다
예외적으로 참조를 해제해줘야 하는 경우
- 자기 메모리를 직접 관리하는 클래스(예제의 스택) -> 비활성 영역이 되는 순간 null처리
- 캐시
- 리스너/콜백
- 예제에서 반복적으로 WeakHashMap이 등장한다
- WeakHashMap은 키를 약한 참조로 저장한다(일단 이렇게 이해했는데 조금 다를지도..?)
약한 참조(간단하게)
강한 참조
StringBuffer buffer = new StringBuffer();
- 우리가 일반적으로 사용하는 레퍼런스 타입
약한 참조
WeakReference weakWidget = new WeakReference(widget);
- 강한 참조를 한번 wrapping했다
- 인자로 넘겨진 widget의 참조가 해제되면 weakWidget의 참조도 해제된다
'책 > Effective Java' 카테고리의 다른 글
[이펙티브 자바] 아이템10: equals는 일반 규약을 지켜 재정의하라 (0) | 2022.04.20 |
---|---|
[이펙티브 자바] 아이템9: try-finally보다는 try-with-resources를 사용하라 (0) | 2022.04.20 |
[이펙티브 자바] 아이템6: 불필요한 객체 생성을 피하라 (0) | 2022.04.18 |
[이펙티브 자바] 아이템5: 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2022.04.18 |
[이펙티브 자바] 아이템4: 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2022.04.18 |