Application 실행속도 보다는 GC 시간을 줄이는 것이 더 좋은 실행환경에 적합하다.

하지만, Heap 크기가 충분히 큰 환경이어야 한다.

명시적으로 지정하려면 -XX:+UseConcMarkSweepGC 옵션을 이용한다.

추가로 incremental mode 를 지정하려면 +XX:+CMSIncrementalMode 옵션을 이용한다.

 

* Young Generation

 -> Parallel Collector 와 동일하다.

 

* Old Generation and Permanent Generation

 -> 다음과 같은 순서로 작동된다.

 1) 처음 상태는 initial phase 로 Application 을 실행된 후에 최초로 한 번 실행되며,

    Application 실행을 잠시 멈추어서 Application 에서 바로 참조가능한 Instance 의 집합을 파악해둔다.

 2) 다음 상태는 mark phase 로 Application 실행 중 파악된 Set 의 변경 사항을 추적한다.

 3) 다음 상태는 remark phase 로 Set 에서 추적되지 않은 사항들을 알아내기 위해 Application 실행을 잠시 멈추고,

    Set 에 포함되지 않은 인스턴스들을 모두 추적한다.

 4) 다음 상태는 concurrent sweep phase 로 이 때에는 Application 실행이 재개되며,

    remark phase 에서 파악된 Garbage 들을 청소하는 스레드들도 같이 실행된다.

 

 

 

CMS 에서는 Compation 을 하지 않기 때문에 다음 그림과 같이 Heap 에 Fragmentation 이 발생한다.

이 빈 공간들은 리스트로 관리되어 운용되는데, 이로 인해 Application 실행속도가 다른 Collector 보다 저하된다.

또한, 메모리 할당을 할 때 충분히 큰 빈 공간이 없으면 Heap 이 계속 커져야 하거나 OutOfMemoryError 가 발생할 수 있으므로,

인접한 빈 공간을 리스트 상에서 합치거나 사용형태에 따라 적절히 빈 공간을 분리해서 낭비를 없애는 작업을 한다.

 

 

 


다른 Collector 와는 달리 Old Generation 이 꽉 찼을 때 GC 가 바로 실행되는 것이 아니라

꽉 차기 전부터 지속족으로 GC 가 실행된다.     

만약, 꽉 차게 되었을 때에는 Serial Collector 나 Parallel Collector 와 같은 GC 를 실행하게 된다.