본문 바로가기
자바

자바 - 객체 참조와 메모리 누수

by 개발자 포비 2024. 11. 27.

자바의 메모리 관리: GC와 메모리 유실 문제

자바는 가비지 컬렉션(GC)이라는 강력한 메모리 관리 도구를 제공하여, C나 C++과 같은 언어에서처럼 직접 메모리를 해제해야 하는 부담을 덜어줍니다. 그러나 GC가 완벽한 해결책은 아닙니다. GC는 메모리 해제가 필요한 객체만을 정리하기 때문에, 실제로 사용되지 않더라도 참조가 남아있는 객체는 메모리에 남아 있게 됩니다.


참조와 메모리 해제

GC는 메모리를 해제할 수 있는 조건을 따릅니다. 그 중 가장 중요한 조건은 해당 메모리를 누군가 참조하고 있는지 여부입니다. 만약 객체가 여전히 참조되고 있다면, GC는 해당 객체를 해제하지 않습니다. 이는 참조 카운팅 개념으로 설명할 수 있지만, 여기서는 자세한 설명을 생략하겠습니다.

 

Stack 클래스의 예시

아래의 코드를 살펴보겠습니다.

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){
            return Optional.empty();
        }
        return elements[--size];
    }

    private void ensureCapacity(){
        if(elements.length == size){
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }
}

이 코드는 스택 자료구조를 구현한 것입니다. 코드만 보면 메모리 유실이 발생할 것 같지 않지만, 실제로는 문제가 발생할 수 있습니다. 스택의 크기가 늘어나거나 줄어들 때, size보다 큰 인덱스에 있는 배열의 참조는 여전히 남아 있습니다. 이로 인해 해당 객체들이 GC에 의해 해제되지 않고 메모리에 남아 있게 됩니다.

 

 

메모리 유실 방지 방법

이 문제를 해결하기 위해, pop 메서드에서 반환된 배열의 참조를 null로 설정하여 해당 객체에 대한 참조 카운트를 감소시켜야 합니다. 이를 통해 더 이상 필요하지 않은 객체가 GC에 의해 정리될 수 있도록 합니다. 예를 들어, pop 메서드를 다음과 같이 수정할 수 있습니다.

public Object pop(){
    if(size == 0){
        return Optional.empty();
    }
    Object obj = elements[--size];
    elements[size] = null; // 참조를 null로 설정하여 메모리 해제 가능
    return obj;
}

이와 같이 코드를 수정하면, 더 이상 필요하지 않은 객체에 대한 참조를 제거하여 GC가 해당 객체를 정리할 수 있도록 도와줍니다.


결론

 자바의 GC는 메모리 관리에 큰 도움을 주지만, 개발자는 여전히 메모리 유실 문제를 인지하고 있어야 합니다. 특히, 자원을 관리하는 자료구조를 구현할 때는 참조를 적절히 관리하여 GC가 효율적으로 작동할 수 있도록 해야 합니다. 이를 통해 메모리의 효율적인 사용을 보장할 수 있습니다.

 

 

참고 - Effective Java Item 7

'자바' 카테고리의 다른 글

자바 - 스트림  (2) 2024.12.09
자바 - try-with-resources  (0) 2024.11.28
자바 - 불필요한 객체 생성  (0) 2024.11.26
자바 - 의존성 주입  (0) 2024.11.26
자바 - 싱글턴 패턴  (0) 2024.11.25

댓글