두근두근이야기
가비지 콜렉터(Garbage Collector) 본문
가비지 콜렉터는 게시글 http://ljhh.tistory.com/entry/%EC%9E%A5%EB%AC%B8%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EB%8A%94-%EC%99%9C-%EB%B2%84%EB%B2%85%EC%9D%B4%EB%8A%94%EA%B0%80-%ED%8D%BC%EC%98%A8%EA%B8%80
여기서 한번 언급된 뒤,
가비지 콜렉터 일전에 한번 짧게 포스팅한 적이 있었죠.
garbage collector란 간단한게 메모리를 정리하는 놈이라고 했었습니다.
1. 가비지 콜렉터란
다시말해 메모리를 정리하는 놈입니다. 쓰이지 않는 메모리를 삭제해주죠. 힙이라는 메모리 영역에만 존재하며, 불필요한 또는 어떤 프로그램이 수행되는 도중에 그 프로그램에서 생성된 객체를 프로그램이 더 이상 사용하지 않을 때 그 객체를 메모리에서 해제하는 역할을 합니다.
개체의 죽음은 두 단계로 이루어 집니다. 첫째로, 개체를 다시 가공되지 않은 메모리로 변환해야 합니다. 이 작업은 소멸자를 작성해서 처리할 수 있습니다. 소멸자는 생성자의 반대 개념입니다. 둘째로, 가공되지 않은 메모리는 힙에 반환되어야 합니다. 개체가 살아왔던 이진 비트는 할당이 해제되야 하는데, 역시 이 단계를 제어할 수는 없습니다. 메모리를 힙으로 반환하는 과정을 가비지 콜렉션이라고 부릅니다. 다시 말해 이를 처리하는 놈은 가비지 콜렉터(쓰레드)라고 부르는 것이구요.
2. 왜 사용하는가
메모리 사용에 효율적입니다. 확보했던 메모리를 해제하지 않으면 힙 영역에 쓰지않는 객체들이 메모리를 차지하여 계속 누적되기 때문에 결국 메모리 Overflow가 발생하지만 가비지 콜렉션이 있기 때문에 사용 후의 Object에 대해 신경쓰지 않아도 자동으로 메모리 해제가 이루어져 별다른 신경을 쓰지 않아도 Overflow가 나지 않습니다. 보통 자동으로 실행되지만 강제적으로 사용할 수 있습니다. 그러나 프로그램 코드는 없는게 더 빠르기 때문에 특별한 상황이 아니면 굳이 사용할 필요는 없습니다.
3. 동작원리
가비지 콜렉터는 고유한 쓰레드에서 동작합니다. 가비지 콜렉터가 동작하면, 개체들을 이동시키고 개체참조를 갱신하기 때문에 이 점은 매우 중요한 것입니다 . 다음과 같은 단계로 실행됩니다.
1. 모든 접근 가능한 개체들의 그래프를 작성하며, 개체내의 참조 필드에 따라 반복적으로 수행된다. 가비지 콜렉터는 그래프를 매우 조심스럽게 구성하며, 순환참조로 인해 무한 재귀 호출이 되지 않도록 한다. 이 그래프에서는 모든 그래프가 접근 가능해야 한다.
2. 접근 불가능한 개체들이 종결을 필요로 하는지 점검한다. 다시 말해서, 접근 불가능한 개체가 소멸자를 가지고 있는지를 확인한다. 종결을 필요로 하는 개체는 freachable queue라고 불리는 특별한 큐에 놓여지게 된다.
3. 종결을 필요로 하지 않는 나머지 접근 불가능한 개체들은 할당이 해제된다. 가비지 콜렉터는 접근 가능한 개체들을 힙의 아래로 옮겨서, 힙을 조각 모음하고 힙 상단의 메모리를 해제시킴으로써 이러한 할당 해제를 수행한다. 가비지 콜렉터가 접근 가능한 개체들을 옮길 대, 개체에 대한 참조도 역시 갱신한다.
4. 가비지 콜렉터는 이제 다른 쓰레드가 계속 수행되게 한다.
5. 종결을 필요로 하는 접근 불가능한 개체 즉, 현재 freachable queue에 들어있는 개체들은 별도의 쓰레드에서 종결된다.
4. 사용방법
자동으로 동작합니다. JVM이 알아서 자기가 필요하다고 느껴질 때 호출을 합니다. 보통은 자동으로 가비지 콜렉터가 실행이 되지만 강제로 실행시킬 수도 있습니다. 바로 지워지지는 않습니다.
Object obj = new Object("");
obj = null;
Object 객체는 참조를 잃어버렸으므로 GC의 대상이 됩니다.
강제사용방법
자바
System.gc(); 를 사용합니다.
C#
GC.Collect(); 를 사용합니다.
'IT > IT' 카테고리의 다른 글
cdecl (0) | 2013.04.02 |
---|---|
gets와 scanf (0) | 2013.03.28 |
달빅(Dalvik virtual machine) (0) | 2013.03.12 |
GC(Garbage Collection), 쓰레기 수집 (0) | 2013.03.12 |
HRZ-engine (0) | 2013.03.10 |