GarbageCollection이란?
- Java에서는 객체를 효율적으로 소멸시키기 위해 사용되는 알고리즘
ReferenceCounter Algorithm
- 각 객체에 참조되어 있는 객체가 있으면 Count를 매겨 객체의 GC 대상 여부를 판별함
- 객체의 Count가 없는 객체만 GC하면 되기 때문에 Suspend 현상이 짧음
- 참조하는 RootSet이 없어도 각 객체 끼리 순환 구조이면 서로를 참조하고 있어 GC 대상이 되지 않고 계속 살아 있게되어 메모리릭 발생 확률이 높아짐.
Mark-And-Sweep Algorithm
- RootSet 부터 참조하는 객체에 Marking하여 객체가 살아 있는지 판별하게 됨.
- Mark Pahse와 Sweep Phase로 나뉨
- Mark Pahse : Application에서 객체의 Reference가 참조되고 있는지 Marking 하는 단계
- Sweep : Mark되지 않는 객체들을 GC하는단계
- 참조되지 않는 객체들은 GC가발생 할때 메모리에서 제거되고 살아있는객체는 그래도 남아있기 때문에 단편화(Fragment)현상이 발생함
Mark-And-Compaction Algorithm
- Mark-And-Compaction 알고리즘을 보안하기 위해 나온 알고리즘
- Sweep 단계에서 Compaction까지 처리하게 됨
Compaction 객체 할당 방식
- Arbitray 방식 : 순서 보장없이 객체를 쌓는 방식
- Liner방식 : 객체가 참조한 순서대로 쌓는 방식
- Sliding 방식 : 객체가 할당된 순서대로 쌓는 방식
Generation Algorithm
- 객체의 생명 주기를 Age로 판변하는 알고리즘
- YoungGeneration과 OldGeneration으로 구분
- YoungGeneration에는 Eden영역과 Survivor1 Survivor2(from ,to)영역으로 나뉘게 됨.
- Old Generation에는 Old 영역이 있음
- 객체가 할당되면 최초에 Eden영역에 쌓이게 되고 Eden영역이 꽉 차게 되면 GC가 발생하는데 이때 발생하는 GC가 Minor GC이다.
- Minor GC가 발생하게 되면 살아있는 객체는 Survivor영역으로 옮겨지게 된다.
- Minor GC가 발생할때마다 Survivor영역은 Suvivor1에 있는 객체를 Survivor2 영역으로 옮기고 Survivor2에 있는 객체를 다시 Survivor1영역으로 옮기는
작업을 한쪽 Survivor영역이 꽉 찰때 까지 반복한다
- 두 쪽 모두 꽉차게 되면 또 한번 GC가 발생하게 되는데 이때 발생하는 GC가 Major GC이다 Major GC가 발생하면 살아있는 객체들은 Old 영역으로 옮
겨 진다.
Copying Alorithm
- 메모리를 Active 영역과 InActive영역으로 나눠서 객체가 할당되면 InActive 영역에 할당 되고 GC가 발생하면 살아 있는 객체는 Active영역으로 옮긴다.
- GC가 발생하면 InActive 영역과 Active영역에 번갈아 가면서 객체를 Copy하여 옮긴다.
- 객체를 순서대로 Copy하여 옮겨서 단편화 현상은 발생하지 않는다.
- 하지만 메모리를 반으로 나누워서 쓰기 때문에 객체를 메모리에 할당하는 공간도 반이 된다.
'java' 카테고리의 다른 글
ClassLoader (0) | 2017.10.14 |
---|---|
GabageCollector (0) | 2017.10.14 |
String StringBuider SttringBuffer 차이 (0) | 2017.10.13 |
예외 (0) | 2017.10.12 |
Reduce Max값 구하기 (0) | 2017.07.03 |