|
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 가 발생할 수 있으므로, 인접한 빈 공간을 리스트 상에서 합치거나 사용형태에 따라 적절히 빈 공간을 분리해서 낭비를 없애는 작업을 한다.
꽉 차기 전부터 지속족으로 GC 가 실행된다. 만약, 꽉 차게 되었을 때에는 Serial Collector 나 Parallel Collector 와 같은 GC 를 실행하게 된다. |
Concurrent Mark-Sweep Collector (CMS)
제제끼나·2014년 2월 6일·조회 3,917
댓글 0
로그인 후 댓글을 남길 수 있습니다.
아직 댓글이 없습니다.

