2014년 11월 15일 토요일

java 에서 메모리 해제

C/C++ 개발자에게 있어서 메모리 관리는 숙명입니다. 큰 프로젝트를 하면 할 수록 메모리 관리에 대한 고민을 항상 해야합니다. 물론 요즘 stl 을 이용이 많아지면서 많이 편해지긴 하였지만, stl의 복잡함과 디버깅의 어려움을 감안하면 아직 어려운게 사실입니다.
반면 자바에서는 메모리 관리를 크게 안해도 된다는게 너무 편하지만 Java는 어떻게 안하게 되었을까 고민을 해봤습니다. 처음 java를 접할때 무한정 늘어나는 String class를 보고 이건 뭐지? 이렇게 좋은 언어가 있다니 하면서 놀라던 때가 생각 나네요. 매일 string copy를 하면서 \0을 넣어주어야 하는 메모리 공간까지 생각해서 메모리를 잡고 복사하고 이동하고 하던 언어만 사용하던 사람에겐 충격으로 다가왔습니다.

Java와 같은 객체지향 언어들은 기본적으로 instance와 그것을 참조 하는 reference만 존재하게 됩니다. instance를 참조하는 reference가 증가하면 instance에 몇개나 참조하는지 count가 있게되고 count가 0이 되는 것들을 모아서 주기적으로 gc(쓰레기처리)를 하게될 겁니다.
그래서 java에서 한번 생각해 봐야 할 것이 순환해서 reference를 참조 하는것을 하지 말아야 합니다. 그리고 static 변수에 할당된 instance는 특별한 경우를 제외하고 reference값이 사라지지 않고 그대로 유지됩니다. 그도 그럴것이 java에서 static변수는 전체를 통해서 유일하게 존재해야 하기 때문에 java vm에서는 해당 변수를 처음부터 끝가지 가지고 있게됩니다. 그렇다면 static 변수에 참조되고있는 instance의 reference를 없앨려면 어떻게 해야 할까요?
간단합니다. 다른 reference를 넣어주면 됩니다. 대표적으로 null 변수를 넣어주면 될겁니다.

test = null;

java관련 메모리 관련 문서
http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf

댓글 없음:

댓글 쓰기