HOTSPOT 가비지 콜렉션 구성 옵션

Java SE 2005/04/12 10:41 Posted by Sun

2004년 6월 30일자 테크팁 가비지 콜렉션 에서는 런타임 환경에서 가비지 콜렉션(garbage collection)을 제어하는 자바 커맨드 라인 툴(the Java application launcher) 을 위한 다양한 비표준(non-standard) 옵션에 대해 설명하였다. J2SE 5.0에서는 이 옵션들 중 몇가지가 수정되거나 강화되었다. 이번 테크팁에서는 몇 가지 변경/추가된 사항에 대해 간단히 살펴보고 좀 더 많은 정보를 제공하는 다른 곳들을 알려주려고한다. 만약 가비지 콜렉션을 위한 HotSpot 옵션이 생소하다면 “가비지 콜렉션” 테크팁을 먼저 읽어보기 바란다.

HotSpot 커맨드 라인 옵션은 Java HotSpot VM Options page에 설명되어 있다. 그런데 이 페이지는 2002년 이후에는 업데이트되지 않았으므로, 5.0 스펙에 대한 내용은 테크니컬 아티클 Tuning Garbage Collection with the 5.0 Java Virtual Machine을 참고하길 바란다. 여기서는 몇 가지 새로운 옵션이나 업데이트된 옵션를 다룬 뿐 아니라 5.0 JVM의 Tuning Garbage Collection 에 대해서도 자세하게 설명하고 있다.

가능한 옵션에 대한 정보를 알 수 있는 또다른 곳은 Sun Microsystems Joseph Mocker의 블로그이다. 이 블로그에서는 가비지 콜렉션 뿐만 아니라 저자가 만든 모든 커맨드 라인 옵션을 다루고있다. 그리고 물론 java.net 에서 Java Research License 하에 이용할 수 있는소스 코드 자체를 살펴볼 수도 있다.

HotSpot 컴파일러는 가비지 콜렉션 사용을 위한 모델을 형성하는 데에 있어 다양한 옵션을 제안한다. 디폴트는 J2SE 플랫폼의 이전버전에서 사용 가능했던 serial collector이다. 이것은 제어하는 데 단지 하나의 쓰레드(즉, 단일 CPU)를 이용하지만, J2SE5.0에서는 throughput collector, concurrent low pause collector, incremental low pause collector와 같은 다양한 방법들을 이용할 수 있다.

serial collector와 달리 throughput generational collector 는 여러 개의 CPU를 사용하여 멀티 쓰레드를 구동한다. throughput collector를 지정하기 위해서는 -XX:+UseParallelGC 옵션을 사용한다. concurrent low pause collector는 어플리케이션을 동시에 실행하며, -Xincgc 또는 -XX:+UseConcMarkSweepGC 옵션으로 지정된다. incremental low pause collector는 더 이상 활발하게 개발되지는 않으나 계속적으로 이용되고 있다. incremental low pause collector를 사용하기 위해서는 -XX:+UseTrainGC 커맨드 라인 옵션을 지정한다. (이 옵션은 J2SE 6.0에서는 이용하지 않을 예정이다)

throughput garbage collector의 adaptive size 정책은 퍼포먼스 튜닝 옵션들과 가비지 콜렉터의 목표를 형성하는 새로운 옵션들을 포함하고 있다. 각각의 옵션과 목적은 다음과 같다.

  • -XX:AdaptiveSizeDecrementScaleFactor=VALUE.

    adaptive size의 축소를 위해 scale-down 요소를 설정한다. 디폴트 값은 4이다.

  • -XX:AdaptiveSizePolicyCollectionCostMargin=VALUE

    만약 collection cost가 한계치 안에 있으면 full delta에 의해 양쪽을 감소한다. 디폴트 값은 50이다.

  • -XX:AdaptiveSizePolicyInitializingSteps=VALUE

    진짜 데이터가 사용되기 전 heuristics를 사용하기 위해 몇 가지 단계를 지정한다.디폴트 값은 20이다

  • -XX:AdaptiveSizeThroughPutPolicy=VALUE

    throuhgput 목표를 위해 generation size를 바꾸는 정책을 지정한다. 디폴트 값은 0이다.

    throuhgput가비지 콜렉션의 adaptive size 정책을 형성하는데 이용할 수 있는 더 많은 옵션들이다. 이들은 J2SE 5.0에서 이용할 수 있는 새로운 설정 중 일부일 뿐이다.

    몇가지 새로운 옵션으로 concurrent low pause collector를 제어하며, 이는 또한 "concurrent mark and sweep."으로 알려져있다. 다음의 설정에서 알수 있듯이, 모든 옵션 이름이 CMS로 시작하는 것은 아니지만 이들의 이름은 일반적으로 “CMS”로 시작한다.

    이 새로운 옵션들은 가비지 콜렉션의 전달과 가능 메모리에 대한 타이밍과 크기를 제어한다. concurrent low pause collector는 XX:+UseConcMarkSweepGC옵션을 통해 사용할 수 있다.

  • -XX:CMSAbortablePrecleanMinWorkPerIteration=VALUE

    각 preclean 반복 주기당 예정되는 최소한의 일을 설정한다. 디폴트 값은 100 이다.

  • -XX:CMSAbortablePrecleanWaitMillis=VALUE

    주기당 작업이 충분하기 않을 경우, 반복되는 각 주기 사이의 수면 시간을 milliseconds 단위로 지정한다. 디폴트 값은 50이다.

  • -XX:CMSBootstrapOccupancy=VALUE

    bootstrapping collection stats에 대한 CMS collection을 초기화하는 CMS 생성 점유율을 지정한다. 디폴트 값은 50이다.

  • -XX:CMSMarkStackSizeMax=VALUE

    CMS marking stack의 최대 크기를 지정한다. 디폴트 값은 4MB이다.

  • -XX:CMSMaxAbortablePrecleanLoops=VALUE

    값이 0보다 클때, 중단될 수 있는 preclean 반복주기의 최대값을 설정한다. 디폴트 값은 0이다.

  • -XX:CMSMaxAbortablePrecleanTime=VALUE

    중단 가능한 preclean 상태의 최대 시간을 milliseconds 단위로 지정한다. 디폴트 값은 1000초나 1초이다.

  • -XX:+CMSPrecleanRefLists1

    (반복되는) preclean 주기 동안 preclean 레퍼런스 목록을 설정한다. 디폴트 값은 true이다.

  • -XX:+CMSPrecleanRefLists2

    abortable preclean phase동안 preclean 레퍼런스 목록을 설정한다. 디폴트 값은 false이다.

  • -XX:CMSSamplingGrain=VALUE

    CMS를 위한 Eden 예제 사이 최소 거리를 지정한다. 디폴트 값은 16K이다.

  • -XX:CMSScheduleRemarkEdenPenetration=VALUE

    remark pause를 시도하고 스케줄링하는 Eden 점유율을 설정한다. 디폴트 값은 50%이다.

  • -XX:CMSScheduleRemarkEdenSizeThreshold=VALUE

    remark를 스케줄링하기 위한 Eden 초기 크기를 설정한다. 만약 사용된 Eden이 이 값 이하일 경우 remark 스케줄링을 시도하지 말 것. 디폴트 값은 2MB이다.

  • -XX:CMSScheduleRemarkSamplingRatio=VALUE

    앞 주기의 점유율이 예정된 스케줄 remark의 1/비율에 이르기 전에 Eden top 샘플링을 시작한다. 디폴트 값은 5이다.

    concurrent low pause collector를 좀 더 자세히 알아보기 위해서는 A Generational Mostly-concurrent Garbage Collector를 참고하기 바란다. 이 콜렉션 모델에 대해 형성가능한 설정값이 많이 있다.

    parallel garbage collector는 두가지 새로운 옵션을 제안한다.

       -XX:ParGCArrayScanChunk=VALUE
       -XX:+ParallelGCRetainPLAB
    

    추가적인 새 커맨드 라인 옵션은 지금의 콜렉터에만 한정된 것이 아니다. 가비지 콜렉터를 사용하는 데에 힌트를 주자면, 사용자는 시간 제한을 millisecond 단위로 요청할 수 있다. 가상 머신은 지정된 최대 시간을 지키기 위해 heap time을 자동으로 조절할 것이다.

       -XX:MaxGCMinorPauseMillis=VALUE
       -XX:MaxGCPauseMillis=VALUE
    

    또 다른 옵션으로 작업 시간에 대한 가비지 콜렉션 시간의 비율을 제어한다.

       -XX:GCTimeRatio=VALUE
    

    예를 들어 함수1/(1 + VALUE)에 따라, 19에 대한 GCTimeRatio 설정은 GC 5%, throughput 95%이다.이 마지막 3개의 옵션은 -XX:+UseParallelGC collector 뿐 아니라 모든 콜렉터에 적용된다. 값을 변경해보면서, 사용자가 다룰 수 있는 가비지 콜렉터 pauses의 종류와, 콜렉션에 쏟을 수 있는 시간 분량을 결정하기바란다.

    더 나아가 사용자는 다음의 새로운 옵션들을 사용하여 heap 크기를 조절할 수 있다:

       -XX:DefaultInitialRAMFraction=VALUE
       -XX:DefaultMaxRAM=VALUE
       -XX:DefaultMaxRAMFraction=VALUE
    

    DefaultInitialRAMFraction의 디폴트 값은 64를 가지고 DefaultMaxRAMFraction는 디폴트 값으로 4를 가진다. Heap의 초기 디폴트 크기는 DefaultInitialRAMFraction에 의해 나눠지는 물리적인 RAM의 크기이다. 사용자 DefaultMaxRAM로 정확한 최대 크기를 설정하거나 DefaultMaxRAMFraction를 사용하여 값 비례를 설정할 수 있다.

    가비지 콜렉션에 한정되있는 것은 아니지만 J2SE 5.0에 새로 등장한 커맨드라인 플래그(flag) 옵션은 치명적인 에러 핸들러에 대한 것이다. 플래그는 치명적인 오류가 발생한 경우 사용자가 구동할 프로그램을 지정할 수 있게하며, 프로그램에 JVM 프로세스를 전달한다. 사용자는 -XX:OnError=VALUE 설정을 통해 치명적인 오류 핸들러를 요청할 수 있다. 예를 들어 다음은 치명적인 오류에 대한 응답으로 gdb 디버거를 시작한다.

       -XX:OnError="gdb %p"
    

    옵션인 %p 인수는 프로세스 id를 나타낸다.

    HotSpot과 JVM(Java Virtual Machine)에 더 많은 새로운 옵션들이 있다. Java Virtual Machine documentation for 5.0에서 추가적인 정보를 얻을 수 있을 것이다. 또한 기술 문서 Turbo-charging Java HotSpot Virtual Machine, v1.4.x to Improve the Performance and Scalability of Application Servers에서도 1.4.x VM 에 관련된 자세한 내용을 제공한다.

  • "Java SE" 카테고리의 다른 글

    2005/04/12 10:41 2005/04/12 10:41

    TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/199

    댓글을 달아 주세요

    1. 김성욱  수정/삭제  댓글쓰기

      여기다 댓글을 달아도 될지 모르겠지만... 혹시 J2SE 5.0 HotSpot VM의 GC 알고리즘에 대한 자료는 어디서 구할데 없을까요? 자료 구하기가 만만치 않네요 ;;;

      2007/09/06 12:40
    2. 이우철  수정/삭제  댓글쓰기

      수고하셨어요

      2007/09/07 20:53
    3. 박정숙  수정/삭제  댓글쓰기

      좋은 정보 감사해요~

      2007/09/19 05:31
    [로그인][오픈아이디란?]

    ◀ Prev 1  ... 529 530 531 532 533 534 535 536 537  ... 626  Next ▶