자바는 가비지컬랙션이 알아서 메모리를 회수해 주는데 이게 만능이 아니다.
아래 코드를 보자.
import java.util.*; public class Stack { public Stack() { public void push(Object e) { public Object pop() { /** |
저걸 보면 메모리 누수가 생기는 부분을 찾을 수 있다 어디냐면 pop() 부부인데
elements를 꺼네오고 나서 아무런 행동을 하지 않기 때문에 해당 공간은 메모리에 그대로 남아있게 되고
그러다보면 프로그램이 메모리 부족으로 죽을 수 도 있다.
그래서 저 부분을 이렇게 수정해주어야 한다.
public Object pop() { if (size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; return result; } |
매모리 누출이 흔히 생기는 이유는 객체 참조를 놔눠서 생기는 부분 말구 또 따른 이유는 캐시이다. 객체 참조를 캐시에 저장하면 저장했다는 것을 잊어버리고 객체가 더 이상 필요 없을 때 까지 캐시에 내벼려 두기 쉽다. 그리고 마지막으로 리스너와 콜백을 사용할 경우 매모리 누수가 발생할 수 있다.
'개발 이야기 > Effective Java' 카테고리의 다른 글
Item 8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. (0) | 2010.03.10 |
---|---|
Item 7. 파이널라이저(Finalizer)의 사용을 피하자 (0) | 2010.03.08 |
Item 5. 불필요한 객체의 생성을 피하자. (0) | 2010.03.08 |
Item 4. private 생성자를 사용하여 인스턴스 생성을 못하게 하자. (0) | 2010.03.04 |
Item 3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. (0) | 2010.03.04 |