콘텐츠로 건너뛰기

Java Hotspot Garbage Collection #3

 

Parallel Collector(Throughput Collector)

 

Serial Collector young generation gc의 개선판

collector를 하나만 돌리는 것이 아니라 여러 개 동시에 동작

multi-processor, multi-thread 시스템에서 좋음

old generation gc는 단일 프로세서로 동작하여 serial collector와 동일함

서버 머신에서 디폴트 값으로 설정되나, 명시적으로 사용하려면 -XX:+UseParallelGC 를 쓴다.

 

 

위 그림에서 주황색 화살표가 GC가 동작하는 시간이다.

여러 개의 collector가 동시에 동작하므로 pause time이 짧다.

 

Concurrent Mark-Sweep(CMS) Collector

 

throughput은 낮지만 response time이 빠른 collector

young generation gc는 parallel Collector와 동일함

old generation gc는 4단계로 나눔

  – initial mark

  – concurrent mark

  – remark

  – concurrent sweep

전체적인 gc에 걸리는 시간은 결코 짧지 않음, 짧게 멈추면서 자주 gc하는 방식

여러 개의 cpu를 가지고, client에게 빠른 응답을 줘야 할 프로그램에서 사용하기 좋음

사용 옵션 -XX:+UseConcMarkSweepGc

 

 

 

initial mark

일단 모든 program 수행을 중단시킴

각 program에서 직접 참조하는 java 객체들을 표시하고, 프로그램 수행 재개

 

 

concurrent mark

이 때는 program을 안 멈추고 표시 작업을 함.

initial mark 때 표시했던 객체를 훑으면서 이 객체가 참조하는 하위 객체를 표시함

 

 

remark

initial mark 이후에 생성된 객체들에 대해서 다시한 번 더 식별함

표시하는 동안 새로운 객체가 생성되면 안되므로 모든 program을 중단함

 

 

concurrent sweep

최종 gc를 수행하여 메모리를 해제함

멀티 프로세서로 진행되므로 짧은 시간에 완료된다

 

 

stop-the-world pause 가 자주 일어나지만 시간 자체를 짧게함

 

CMS Collector의 단점

  – gc를 수행하는데 표시 작업을 3번이나 진행함

  – 다른 collector와 달리 compaction을 진행하지 않으므로 메모리 단편화가 발생함

  – 메모리 단편화의 사이드 이펙트로 객체가 들어갈 빈 공간을 찾는데 시간이 걸린다.

    (다른 collector는 compaction을 하므로 빈 공간 시작 주소값이 있지만, CMS는 그렇지 않음)

  – 다른 collector 보다 heap 영역을 더 사용함

    (concurrent mark 단계에서 프로그램이 계속 동작하므로 계속 객체가 발생함)

    (이미 marking했지만 더이상 사용하지 않는 객체도 발생함 : floating garbage)

  – 객체의 평균크기를 추정하여, memory 정리하는 작업을 추가적으로 해야함(메모리 단편화)

 

메모리가 가득차면 Mark-Sweep-Compact 로 full gc를 수행하므로 old generation의 남은 용량이 중요함

old generation의 영역이 일정 비율 이상 차면 gc를 수행하게 하는 옵션

-XX:CMSInitialOccupancyFraction=<n> (디폴트값은 68%)

 

incremental mode

concurrent mark가 프로그램 수행중에 동작하므로 해당 작동 시간을 짧게 자주하는 방식

CMS collector는 시간을 잘게 나누어 young generation gc 사이사이에 틈틈히 concurrent mark를 함

(일종의 시분할 스케쥴링)

사용 옵션 -XX:+CMSIncrementalMode

 

몇 가지 옵션

-XX:MaxGCPauseMillis=n : 최대 멈추는 시간 지정 (디폴트로는 지정 안되어 있음)

-XX:+PrintGCDetails

-XX:+PrintGC

-XX:+PrintGCTimeStamps

 

client machine 의 디폴트 값

– client JVM

– serial garbage collector

– initial heap size : 4MB

– Maximum heap size : 64MB

 

server machine 의 디폴트 값

– server JVM

– parallel garbage collector

– initial heap size : 1/64 physical memory (최대 1GB)(최소 32MB, 보통 2GB 메모리 이상 쓰므로)

– Maximum heap size : 1/4 physical memory(최대 1GB)

 

기타

young generation은 전체 heap 영역의 1/2 보다 약간 적게,

survivor space는 young generation의 1/8 정도가 적당하다.

JVM의 디폴트 값은 young generation이 너무 작게 잡혀있으므로 디폴트는 권장하지 않는다.

young generation이 작으면 short live object가 old generation으로 넘어갈 확률이 높아지고,

major full gc가 자주 발생하므로 느려진다.

 

 

참고 문서 출처:

http://java.sun.com/javase/technologies/hotspot/gc/memorymanagement_whitepaper.pdf

http://ryudaewan.springnote.com/pages/145343

http://blog.naver.com/agapeuni/60067890631

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다