peaches-book-study / effective-java

이펙티브 자바 3/E
0 stars 2 forks source link

Item 7. 다 쓴 객체 참조를 해제하라 #8

Open byunghyunkim0 opened 7 months ago

byunghyunkim0 commented 7 months ago

Chapter : 2. 객체 생성과 파괴

Item : 7. 다 쓴 객체 참조를 해제하라

Assignee : byunghyunkim0


🍑 서론

가비지 컬렉터를 갖춘 언어라도 메모리 관리에 대해서 생각을 해야한다.

🍑 본론

가비지 컬렉션에서 메모리 누수 발생

public class Stack {
    private Object[] elements;
    private int size = 0;
    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];
    }

    // 해법
    public Object pop(){
        if(size == 0){
            throw new EmptyStackException();
        }
        Object result = elements[--size];
        elements[size] = null;
        return result;
    }

    /**
     * 원소를 위한 공간을 적어도 하나 이상 확보한다.
     * 배열 크기를 늘려야 할 때마다 대략 두 배씩 늘린다.
     */
    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}

public class WeakHashMapTest {

public static void main(String[] args) {
    WeakHashMap<Integer, String> map = new WeakHashMap<>();

    Integer key1 = 1000;
    Integer key2 = 2000;

    map.put(key1, "test a");
    map.put(key2, "test b");

    key1 = null;

    System.gc();  //강제 Garbage Collection

    map.entrySet().forEach(el -> System.out.println(el));

}

}


### 3. 리스너 or 콜백
- 클라이언트가 콜백을 등록만하고 해지하지 않는다면, 계속 쌓임
    - 콜백을 약한 참조로 저장하면 해결된다. ex) WeakHashMap에 키로 저장
# 🍑 결론

--- ---
## Referenced by
-