brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Feb 27. 2018

Effective Java - 객체의 생성과 소멸

#06 쓸모없는 객체 참조를 제거하자

Effective Java - 객체의 생성과 소멸


#06 쓸모없는 객체 참조를 제거하자


자바에서는 더 이상 참조되지 않는 객체의 메모리를 자동으로 Garbage Collection가 회수하고 있습니다.

자동으로 메모리 관리를 해주기는 하지만 메모리 누출 문제들이 발생할 수 있습니다.

메모리 누출은 아래와 같은 문제점들을 초래하게 됩니다.

메모리 누출 발생

메모리 부족

GC 작업이 증가 or 메모리 할당과 회수가 빈번하게 발생

디스크 상의 페이징 발생 or Out Of Memory으로 인해 종료


이를 방지하기 위한 방법에 대해 알아보겠습니다.



아래 코드는 Object를 이용한 Stack 구현 클래스입니다.

기본적인 push, pop 동작에는 문제가 없지만 메모리 누출(leak)이 발생할 수 있습니다.


#01 Stack class


pop() 메서드를 호출하면 아래와 같이 스택(Object 배열 elements)의 크기가 줄어들게 됩니다.


#02 push & pop


만약 pop() 호출로 인해, 스택에서 꺼내졌던 객체들은 GC 되지 않을 겁니다.

그 객체들을 가리키는 쓸모없는 참조를 스택에서 여전히 가지고 있기 때문입니다.

쓸모없는 참조란, 객체에 대한 참조 값(null이 아닌)을 가지고 있지만 다시는 사용되지 않은 참조.


#03 쓸모 없는 참조


이처럼 GC가 자동으로 지원되는 자바에서도 예기치 않은 메모리 누출이 발생할 수 있습니다.

일반적으로 특정 클래스에서 자신의 메모리를 자기가 관리한다면, GC 입장에서는 어떤 객체가 참조가 끊어졌는지 모르기 때문에 프로그래머는 항상 메모리 누출에 주의해야 합니다.


이를 해결하기 위해 아래와 같이 쓸모없는 참조를 null로 만들 수 있습니다.

쓸모없는 참조를 null로 바꾸면 이를 이용하다가 NullPointerException 예외가 발생하므로 나도 모르게 엉뚱하게 실행되는 것보다 낫습니다.


#04 null


하지만 무분별하게 null로 바꾸는 것은, 코드가 필요 이상으로 어수선해지기 때문에 꼭 필요할 때만 처리해야 합니다.




이 외에도 프로그래머가 직접 관리하지 않고, WeakReference를 이용해 GC가 발생할 때마다 자동으로 회수되도록 할 수 도 있습니다.


좀 더 자세한 내용은 아래 링크들을 참고해 주시기 바랍니다.


http://d2.naver.com/helloworld/329631

https://developer.android.com/reference/java/lang/ref/WeakReference.html




메모리 문제는 항상 어렵습니다ㅠ

안드로이드에서는 아래 leakcanary를 통해 어느 정도 찾을 수 있으니 이용해 보시기 바랍니다.



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari