Free Lines Arrow
본문 바로가기
Language/Effective Java

[Effective Java] 다쓴 객체 참조 해제 하기

by skahn1215 2022. 5. 18.
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
반응형

댓글