... | ... | @@ -7,7 +7,7 @@ |
|
|
|
|
|
* **garbage collection :** 메모리를 해제하고 새롭게 재배치 하는 작업을 칭하고 자동으로 수행되지만 수동으로도 수행을 명령할 수도 있다. garbage collection이 수행되는 시기는 개발자가 알 수 없지만 분명한 것은 메모리가 부족하면 분명 garbage collection이 일어난다는 것이다.
|
|
|
|
|
|
* **[garbage collector 동작방식](#first)** CLR의 heap은 generation로 나뉘어 관리된다. managed heap 입장에서 generation을 구분하는 것은 단지 메모리의 위치를 가리키는 내부 포인터에 의해 이뤄진다. 처음 new로 할당된 객체는 generation 0에 속한다. generation 0객체의 총 용량이 일정 크기를 넘어가면 GC는 가비지 수집을 한다. 사용되지 않는 generation 0 객체가 있으면 없애고, 그 시점에도 사용되고 있는 객체는 generation 1로 승격한다. generation 1로 승격된 객체의 총 용량도 일정 크기를 넘어가게 되면 CG는 generation 0, 1세대에 모두 가비지 수집을 한다. 1세대의 객체가 그 시점에도 사용되고 있으면 generation 2로 승격한다. generation 2로 승격된 객체의 총 용량도 일정 크기를 넘어가게되면 GC는 generation 0, 1, 2의 모든 객체를 가비지 수집한다. CLR의 generation은 generation 2가 끝이다. 이후 generation 2의 메모리 공간은 시스템이 허용하는 한 계속 커지게 된다.
|
|
|
* **[garbage collector 동작방식](#first) :** CLR의 heap은 generation로 나뉘어 관리된다. managed heap 입장에서 generation을 구분하는 것은 단지 메모리의 위치를 가리키는 내부 포인터에 의해 이뤄진다. 처음 new로 할당된 객체는 generation 0에 속한다. generation 0객체의 총 용량이 일정 크기를 넘어가면 GC는 가비지 수집을 한다. 사용되지 않는 generation 0 객체가 있으면 없애고, 그 시점에도 사용되고 있는 객체는 generation 1로 승격한다. generation 1로 승격된 객체의 총 용량도 일정 크기를 넘어가게 되면 CG는 generation 0, 1세대에 모두 가비지 수집을 한다. 1세대의 객체가 그 시점에도 사용되고 있으면 generation 2로 승격한다. generation 2로 승격된 객체의 총 용량도 일정 크기를 넘어가게되면 GC는 generation 0, 1, 2의 모든 객체를 가비지 수집한다. CLR의 generation은 generation 2가 끝이다. 이후 generation 2의 메모리 공간은 시스템이 허용하는 한 계속 커지게 된다.
|
|
|
|
|
|
* **full garbage collector :** GC가 generation을 구분한 이유는 프로그램 실행 도중 generation 0에 할당되고 수집되는 비율이 매우 높다는 통계적 근거를 기반으로 한다. 따라서 generation 0객체가 꾸준히 할당되어 가비지 수집이 될 기준을 넘어서면 GC는 모든 세대에 걸쳐 가지 수집을 하지 않고 우선 generation 0 heap에 대해서만 빠르게 수행한다. generation 0에만 가비지 수집을 하게 되면 generation 1 heap이 필연적으로 자라게된다. 그래서 generation 0 가비지 수집만으로 메모리 확보가 부족해지면 generation 1 heap까지 가비지 수집을 하게된다. 이런 현상이 계속되면 전체 generation에 가비지 수집을 하는 경우가 발생하는데 이를 Full GC라고 한다.
|
|
|
|
... | ... | |