728x90
반응형
다쓴 객체 참조 해제하기
- 자바같은경우 GC 가 있어서 자동으로 메모리를 해제해준다.
- 자바의 가장큰 이점이다 하지만 메모리 누수가 발생하는경우도 많다.
메모리누수가 생기는경우
- Static 변수 남용
- 래퍼 클래스(Wrapper)로 의미 없는 변수 선언
- 스트림객체 사용후 닫지 않는경우
- 다쓴 참조(Obsolete reference)를 가지고 있는경우
다쓴 참조를 가지고 있는경우
- 여기서 정리할건 다쓴 참조를 가지고 있는 경우 를 살펴볼것이다.
Stack Code
- 아래 코드에서 pop() 부분에서 메모리 누수가 발생한다.
- 이유는 엘리먼트를 꺼내기만 했다
- 그렇게 되면 앞으로 쓰지않는 객체들을 참조하고 있어 GC 가 메모리를 회수 하지 않는다..
- null 처리를 해줘야한다.
package ObsoleteReference;
import java.util.Arrays;
import java.util.EmptyStackException;
public class Stack {
private Object[] elements;
private int size;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}
public Object pop() {
if (size == 0) {
throw new EmptyStackException();
}
// 메모리 누수 발생!!!!!!
return elements[--size];
}
private void ensureCapacity() {
if (elements.length == size) {
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
}
Stack Code 개선
- 아래처럼 더이상 참조 하지 않도록 한다.
public Object pop() {
if (size == 0) {
throw new EmptyStackException();
}
Object result = elements[--size];
elements[--size] = null;
return result;
}
참고:
이펙티브 자바
728x90
반응형
댓글