1. garbage collection (쓰레기 수집)

- 자바 프로그램이 더 이상 참조되지 않는 메모리를 모아 시스템에 되돌려 주는 것.

- 프로그래머는 메모리에 대해서는 아무 관여하지 않는다.

- 참조중인 객체를 찾는 방법

참조계수 기법 (reference-counting) : 객체를 참조하는 갯수를 추적하여 참조중인 객체를 구분.

- heap 안에 있는 각 객체마다 참조계수(reference-count)가 유지

- 어떤 객체가 처음 생겨서 그 객체를 참조하는 변수에 배정하면 참조계수는 1이고 다른 변수가 그 객체를 참조할 때 참조계수는 1씩 증가한다. 그리고 객체를 참조하는 변수가 다른 값이 배정되면 1씩 감소한다.

- 참조계수가 0인 객체 : garbage

추적 기법 (tracing) : 루트 노드에서 시작하는 참조의 그래프를 추적하는 방법.



① simple garbage collection

mark-sweep 방식

- 주기적으로 전체 메모리를 탐색하여 garbage를 찾음.

- local variable array와 stack에서 참조하는 각 객체를 '유효함' 상태로 체크

- 유효하다고 체크된 각 객체들이 참조하는 다른 객체들도 역시 '유효함'

⇒ mark 단계

- 유효함 체크 과정이 끝나고 유효함 체크를 받지 못한 객체들은 garbage로 간주

- garbage로 간주된 객체는 garbage collector에 의해 수거된다.

⇒ sweep 단계

- garbage collection이 진행중인 경우, garbage collector 이외의 모든 쓰레드는 중지되어야만 한다. garbage collection 하는 중에, 유효하다고 체크되지는 않았지만 실제로는 유효한 객체에 대한 참조를 다른 쓰레드가 메모리에서 옮기고 다닐 수 있기 때문에 그 객체는 garbage로 간주될 수 있기 때문이다.



② generational garbage collection

- 메모리 일부만 탐색하여 garbage를 찾는 방식으로 mark-sweep 방식보다 전체 처리 속도 향상.

- 자바 프로그램에서 만들어지는 대부분의 객체들은 매우 짧은 시간 동안만 참조되어진다는 것과 오랫동안 유효했던 객체는 계속적으로 유효할 것이라는 전제를 바탕으로 한다.

- 객체들은 언제 생성되었는지를 기준으로 세대별로 묶이게 된다.

- heap을 객체들 한 '세대(generation)'에 의해 두 개 이상의 각 subheap으로 나눔.

- 객체가 처음 생성되면 특정 subheap에 메모리를 할당해준다.

- 대부분의 객체가 수명이 짧으므로 첫 번째 garbage collection이 일어나면 살아있는 객체는 아주 적음. 이 때 가장 어린 세대로서 살아 남은 객체는 다음 세대로 등급이 올라감 : 다른 supheap로 옮겨진다.

- 어린(younger) 객체는 늙은(older) 객체보다 더 자주 garbage collection을 함.



※ compaction 기법

- garbage collection 이후 객체들이 참조하는 메모리는 순서대로 되어 있지 않고 흩어져서 존재하기 때문에 큰 크기의 객체가 차지할 만한 곳을 찾기가 힘들어지게 된다.

⇒ fragmentation (단편화)

- 이런 단편화를 최소화하기 위해서 compaction 기법을 사용한다.

- 현재 참조되고 있는 객체를 heap의 한 쪽 끝으로 모으는 기법

- 하나의 메모리 공간이 다른 공간으로 복사되어야 함.

- 옮겨진 객체는 새로운 위치로 참조가 갱신됨.



※ finalization (객체 최종화)

- class는 static으로 선언되지 않고, 아무런 인자도 받지 않고, 어떤 값도 return 하지 않는 finalize라는 method를 사용하여 finalization을 요구할 수 있다.

- 객체가 finalizer를 가지고 있으면서 더 이상 참조되지 않으면 garbage collector는 객체에 의해 점유되고 있는 메모리를 재사용하기 위해 finalizer를 호출한다.

- finalizer는 반드시 한번 호출되어야 한다.

- 객체가 언제 어디서 어떤 순서로 finalizer를 호출한다는 것은 보장하지 않는다.

- protected void finalize() throws Throwable {

super.finalize();

}

'old > JAVA' 카테고리의 다른 글

Synchronization (ArrayList, HashMap)  (0) 2010.05.24
Collection Framework  (0) 2010.05.24
Iterator(구 Enumeration), ListIterator  (0) 2010.03.16
Stack & Queue  (0) 2010.03.15
Deep Copy vs Shallow Copy  (0) 2010.03.15
Posted by jazzlife
,