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();
}
- 자바 프로그램이 더 이상 참조되지 않는 메모리를 모아 시스템에 되돌려 주는 것.
- 프로그래머는 메모리에 대해서는 아무 관여하지 않는다.
- 참조중인 객체를 찾는 방법
참조계수 기법 (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 |