JAVA Memory Leak

Tags:

가끔가다 물어보는 사람이 있는 내용입니다. ‘자바에서는 메모리 해제 어떻게 해요?’ 하는 질문이죠..

이에 대한 답은, JavaONE에서 나온 ‘Does Java have Memory Leaks?’란 자료를 보세요. (http://java.sun.com/javaone/99/pdfs/e618.pdf)

요약하면, 자바는 GC를 사용하는데 자바에서도 GC는 reachable 인스턴스를 가비지 콜렉션의 대상에 넣지 않는 전형적인 mark&sweep 방식을 사용합니다.

따라서 사용하지 않으면서 인스턴스를 reachable하게 놔두면 잠재적인 memory leak이 된다는 것이 위 자료의 내용입니다. 그래서 객체를 다 사용했으면

BigObject bo = new BigObject();
….
bo = null;

과 같이 널을 할당해 주어야만 unreachable이 됩니다.

인스턴스 변수와 static변수에 대해서만 이렇게 해주면 되고, 지역변수에 대해서는 이와같은 처리를 할 필요가 없습니다. 하지만 오래된 자바버젼(정확히 어떤버젼에서 문제가 발생하는지까지는 모릅니다)에서는 함수 호출시 지역변수가 할당된 스택프레임에 있는 변수를 즉각적으로 파괴하지 않으므로 지역변수에 대해서도 이와같이 null을 할당해 주어야합니다. 이문제는 잘 알려지지 않은 일종의 버그나 마찬가지인 문제였는데 최신의 JVM에서는 고쳐졌습니다.

대부분의 경우 메모리 문제까지 걱정할 정도로 상태가 악화되는 경우는 없습니다. 전에 모양이 백줄정도의 코드를 작성한뒤(물론 백줄의 코드가 수없이 호출된다면 얘기가 다르겠지만.. 여기서는 코드 복잡도의 기준으로 라인수를 인용한 것입니다), 메모리 낭비가 심한 것 같다고 어떻게 해야하나를 걱정하던데, 그런 걱정은 할 필요가 없습니다. 자바는 그런 걱정에서 프로그래머를 해방시킨 언어이기 때문입니다.

굳이 null 할당을 안하더라도, 정말 과도한 메모리 집약적 애플리케이션이나 과도한 복잡도를 갖기 전에는 좀처럼 문제로 나타나지 않습니다… 그러나 지속적 재사용을 위한 코드라면 이런 문제를 고려해야만 하겠죠.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *