본문 바로가기

java

GarbageCollection

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