1. 미들웨어이야기/01. JVM

Sun HotSpot JVM (1.5 기준)

OSSW(Open Source System SoftWare 2009. 6. 16. 10:51
출처 : http://wiki.ex-em.com/index.php/JVM_Options
Standard Options
Option Description
-client Client HotSpot JVM을 사용한다. Client HotSpot JVM은 Desktop용 Application을 구동하는데 유리하다. 성능 최적화(Optimization) 과정을 간략화함으로써 Application의 시작 시간을 최소화한다.
-server Server HotSpot JVM을 사용한다. Server HotSpot JVM은 Server용 Application을 구동하는데 유리하다. 성능 최적화(Optimization)에 필요한 모든 과정을 최대한으로 수행한다. Application의 시작 시간은 느리지만, 일정 시간이 흐르면 Client HotSpot JVM에 비해 훨씬 뛰어난 성능을 보장한다.

(참고)Jdk 1.5부터는 Server-Class 머신인 경우에는 -server 옵션이 기본 적용된다. Server-Class 머신이란 2장 이상의 CPU와 2G 이상의 메모리를 갖춘 머신을 의미한다.

-d32 32bit JVM을 사용한다. 32bit JVM은 메모리를 최대 2G까지만 사용할 수 있다. 반면 일반적인 수행 성능 64bit JVM에 비해 뛰어난 경우가 많다. 따라서 큰 크기의 Java Heap을 사용하지 않는 경우에는 비록 64bit 머신이라고 하더라도 32bit JVM을 사용하는 것이 권장된다.
-d64 64bit JVM을 사용한다. 64bit JVM에서 사용가능한 메모리의 크기에는 사실상 제한이 없다. 대형 Application들의 경우 수G ~ 수십G의 Java Heap을 사용하는 경우가 많다.
-agentlib:<libname>[=<options>] Native Agent Library를 로딩한다. Native Agent Library란 JVMPI/JVMTI를 구현한 Library를 의미하며 C/C++로 구현된다. JVM은 Unix/Linux에서는 lib<libname>.so 파일이, Windows에서는 <libname>.dll 파일을 탐색한다. 해당 파일은 현재 Directory나 PATH 변수에 등록된 Directory에 존재해야 한다.

(참조) JDK 1.4까지는 HProf를 실행시키기 위해 -Xrunhprof:option=value 옵션을 사용한다. JDK 1.5부터는 -Xagentlib:hprof=option=value 옵션이 권장된다. -Xrunhprof 옵션은 차후 없어질 수 있다.

-agentpath:<pathname>[=<options>] -agentlib 옵션과 동일한 기능이다. Library 이름 대신 Full Path 명을 준다.
-javaagent:<jarpath>[=<options>] Java Agent Library를 로딩한다. Java Agent는 Native Agent가 C/C++로 구현되는 것과 달리 Java로 구현된다. java.lang.instrument Package를 통해 Java Agent를 구현하는 필요한 Interface가 제공된다. Java Agent는 BCI를 통해 Runtime에 Class들의 Bytecode를 변경하는 방법을 통해 작업을 수행한다.

Non-Standard Options (-X)

Option Description
-Xbootclasspath[/a|/p]:<path> Boot class path를 제어한다. /a 옵션은 Boot class path의 제일 뒤에 Append, /p 옵션은 제일 앞에 Prepend한다. 일반적인 환경에서는 Boot class path를 제어할 필요가 없다. Java Core Library(rt.jar 등)등에 대해 Reverse Engineering을 수행하고 행동 방식을 변경하고자 할 경우에 주로 활용된다.
-xcheck:jni
-Xint Intepreter 모드로만 ByteCode를 실행한다. Interpreter 모드로 실행될 경우에는 JIT Compile 기능이 동작하지 않는다. 이 옵션을 활성화하면 실행 속도이 다소 저하될 수 있다. 따라서 HotSpot Compiler의 버그로 문제가 생길 때만 사용이 권장된다.
-Xnoclassgc Class Garbage Collection을 수행하지 않는다.
-Xloggc:<file> GC Log를 기록할 파일명을 지정한다. 파일명을 지정하지 않으면 Standard Out이나 Standard Error 콘솔에 출력된다. 주로 -XX:+PrintGCTimeStamps, -XX:+PrintGCDetails 옵션과 같이 사용된다.
-Xmixed Mixed 모드로 ByteCode를 실행한다. HotSpot JVM의 Default 동작 방식이며, -Xint 옵션과 상호 배타적인 옵션이다.
-Xmn<size> Young Generation이 거주하는 New Space의 크기를 지정한다. 대개의 경우 이 옵션보다는 -XX:NewRatio 옵션이나 -XX:NewSize 옵션을 많이 사용한다.
-Xms<size> Java Heap의 최초 크기(Start Size)를 지정한다. Java Heap은 -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx 옵션으로 지정한 크기만큼 커진다. Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여할 것을 권장한다. 크기의 동적인 변경에 의한 오버 헤드를 최소화하기 위해서이다.
-Xmx<size> Java Heap의 최대 크기(Maximum Size)를 지정한다. Java Heap은 -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx 옵션으로 지정한 크기만큼 커진다. Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여할 것을 권장한다. 크기의 동적인 변경에 의한 오버 헤드를 최소화하기 위해서이다.
-Xrunhprof[:help][:option=value,...] HProf(Heap and CPU Profiling Agent)를 실행한다. HProf는 JVMPI/JVMTI를 이용해 구현된 Sample Profiler이다. 비록 Sample에 불과하지만, 많은 경우 HProf만으로도 상당히 유용한 정보들을 얻을 수 있다.
-Xrs OS Signal사용을 최소화한다. 가령 이 옵션을 켜면 kill -3 [pid] 명령을 수행해도 Thread dump가 발생하지 않는다.
-Xss<size> 개별 Thread의 Stack Size를 지정한다. 예를 들어 Thread Stack Size가 1M이고, Thread가 최대 100개 활성화된다면, 최대 100M의 메모리를 사용하게 된다. 대부분의 경우 기본값(Default)을 그대로 사용하는 것이 바람직하다. 많은 수의 Thread를 사용하는 Application의 경우 Thread Stack에 의한 메모리 요구량이 높아지며 이로 인해 Out Of Memory Error가 발생할 수 있다. 이런 경우에는 -Xss 옵션을 이용해 Thread Stack Size를 줄여주어야 한다.

Non-Standard Options (-XX)

-XX 옵션 Boolean 유형은 접두어로 + 붙이면 활성화(Enable), - 붙이면 비활성화(Disable) 의미한다.

Option

Default

Description

-XX:+AggressiveHeap

False

그대로 Heap Aggressive(공격적)하게 사용하는 옵션이다. 옵션이 활성화되면 JVM 현재 Application Memory-Intensive 것으로 간주하고 Heap 공간을 최대한 사용하게끔 관련된 다른 옵션 값들을 결정한다. 가령 UseParallelGC 옵션을 활성화시키고, Java Heap 크기를 Physical Memory 최대치에 가깝게 설정한다.
옵션은 비록 사용하기는 간편하지만, 일반적으로 사용되지는 않는다. 대부분의 경우, 개별적인 옵션들을 이용해 세밀한 튜닝을 시도한다.

-XX:+CMSClassUnloadingEnabled

False

CMS Collector Permanent Generation 대해 GC 작업을 수행하지 않으며, Class 메타데이터에 대한 Unloading 작업 또한 수행하지 않는다. 따라서 Application 특성상 많은 수의 Class 동적으로 생성하고 Loading하는 경우에는 Permanent Generation에서 Out Of Memory Error 발생할 있다. 이런 경우에는 옵션과 함께 CMSPermGenSweepingEnabled 옵션을 사용해서 Permanent Generation 대한 GC 작업과 Class Unloading 작업을 활성화한다. JDK 1.5까지는 옵션을 모두 활성화해야 Class Unloading 이루어진다. JDK 1.6부터는 CMSPermGenSweepingEnabled 옵션을 활성화하지 않아도 옵션이 작동한다.

-XX:CMSFullGCsBeforeCompaction=<value>

-1

CMS Collector에서 Compaction(압축) 수행하기 전에 Full GC 수행할 회수를 지정한다. 일반적인 Full GC Compaction 작업을 수반한다. 반면에 CMS Collector Full GC Compaction 수행하지 않는다. 이로 인해 Heap Fragmentation 발생할 있지만, Full GC 의한 Pause Time 최소화할 있다는 장점이 있다.

옵션은 Compaction 발생 시점을 제어하는 역할을 한다. 예를 들어 값이 "1" 경우, Concurrent Full GC 아직 종료되지 않은 시점에 새로운 Concurrent Full GC 작업이 시작되면(1), Compaction 수반된다. 만일 값이 "0" 경우에는 Concurrent Full GC "항상" Compaction 수반한다. 따라서 CMS Collector 사용하는 환경에서 Heap Fragmentation 의한 문제가 발생하는 경우에는 "0" 값을 부여하는 것이 Workaround 있다.

-XX:+CMSIncrementalMode

False

Full GC 작업을 Incremental하게 진행한다. 일반적으로 CMS Collector Old Generation 어느 정도 이상 점유되면 Concurrent Full GC 작업을 시작한다. 반면 옵션이 활성화되면 Old Generation 사용률과 무관하게 백그라운드에서 점진적으로(Incremental) Old Generation 대한 GC 작업을 수행한다. 옵션을 사용하면 CMSInitiatingOccupancyFraction 옵션은 무시된다.

옵션을 활성화하면 Throughput 다소 줄어들고, Response Time 개선되는 경향이 있다. 따라서 GC 작업 Pause 줄이고 싶을 경우에 사용할 있다.

-XX:CMSInitiatingOccupancyFraction=<value>

-1

CMS Collection 시작되는 임계값을 결정한다. 만일 값이 "50"이면 Old Generation 50% 이상 사용되면 Concurre Full GC 시작된다. 값의 기본값은 "-1"이다. 경우에는 CMSTriggerRatio 옵션과 MinHeapFreeRatio 옵션이 임계치로 사용된다. 임계치의 계산 공식은 다음과 같다.

Start Ratio = 100-MinHeapFreeRatio(=40) + MinHeapFreeRatio(=40) * (CMSTriggerRatio(=80)/100) = 92
, CMSInitiatingOccupancyFraction 옵션이 지정되지 않으면 Old Generation 92% 정도 사용될 Concurrent Full GC 시작된다.
옵션을 지정하면 50%에서 시작하여, 옵션으로 지정된 값까지 점진적으로 임계값을 조정한다. 만일 임계값을 고정하고자 경우에는 UseCMSInitiatingOccupancyOnly 옵션을 활성화해야 한다.
옵션의 값이 작으면 CMS Collection 그만큼 빨리 동작하기 때문에 Promotion Failure 의한 Stop The World GC 작업이 발생할 확률이 그만큼 줄어든다.

-XX:+CMSPermGenSweepingEnabled

False

CMS Collector 기본적으로 Permanent Generation 대해 Collection 수행하지 않는다. 따라서 많은 수의 Class Loading하는 경우 Out Of Memory Error 발생할 있다. 옵션을 활성화하면 Permanent Generation 대한 Collection 수행한다. JDK 1.5까지는 옵션과 함께 CMSClassUnloadingEnabled 옵션을 활성화해야 동작한다.

-XX:CompilerCommandFile=<file>

.hotspot_compiler

Compiler Command File 위치를 지정한다.

-XX:+DisableExplicitGC

False

System.gc 호출에 의한 Explicit GC 비활성화한다. RMI 의한 Explicit GC Application에서의 Explicit GC 원천적으로 방지하고자 경우에 사용된다.

-XX:GCHeapFreeLimit=<Percentage>

5

Parallel Collector 사용할 GC도중 Out Of Memory Error 발생을 방지하는데 도움을 준다. GC 확보해야할 Free Space 하한선을 결정한다. 값은 Max Heap 크기에 대한 Free 공간 크기의 비율이며 기본값은 "5"이다. Parallel Collection 확보해야할 Free 공간 크기가 적어도 Max Heap 크기의 5% 이상이 되도록 보장하는 것이다.

-XX:GCTimeLimit=<Percentage>

90

Parallel Collector 사용할 GC도중 Out Of Memory Error 발생을 방지하는데 도움을 준다. 전체 JVM 수행시간 대비 Parallel Collection 수행 시간의 상한선를 결정한다. 기본값은 "90"이다. Parallel Collection 전체 수행 시간의 90%까지 사용할 있게 된다.

-XX:+HeapDumpOnOutOfMemoryError

False

Out Of Memory Error 발생하면 Heap Dump File 기록한다. JDK 1.6 부터 지원되는 옵션이다.

-XX:MaxGCMinorPauseMillis=<Value>

None

Minor GC 의한 Pause Time <value>ms 이하가 되게끔 Heap 크기와 기타 옵션들을 자동으로 조정하는 기능을 한다. 값은 목표값(Target)이지 고정값이 아니다. Minor GC 의한 Pause Time 경우에 Workaround 사용할 있다.

-XX:MaxGCPauseMillis=<Value>

None

GC 의한 Pause Time <value>ms 이하가 되게끔 Heap 크기와 기타 옵션들을 자동으로 조정하는 기능을 한다. MaxGCMinorPauseMillis 옵션과 마찬가지로 목표값으로서의 역할을 한다. GC 의한 Pause Time 경우에 Workaround 사용할 있다.

-XX:MaxHeapFreeRatio=<Value>

70

Heap Shrinkage 수행하는 임계치를 지정한다. 예를 들어 값이 70이면 Heap Free 공간이 70% 이상이 되면 Heap 크기가 축소된다. MinHeapFreeRatio 옵션과 함께 Heap 크기 조정을 담당한다.

-XX:MaxNewSize=<Value>

None

Young Generation 최대 크기를 지정한다. Young Generation 시작 크기는 NewSize 옵션에 의해 지정된다.

-XX:MaxPermSize=<Value>

None

Permanent Generation 최대 크기를 지정한다. Permanent Generation 시작 크기는 PermSize 옵션에 의해 지정된다. 많은 수의 Class Loading하는 Application PermSize MaxPermSize 옵션을 이용해 Permanent Generation 크기를 크게 해주는 것이 좋다. Permanent Generation 크기가 작을 경우에는 Out Of Memory Error 발생할 있다.

-XX:MinHeapFreeRatio=<Value>

40

Heap Expansion 수행하는 임계치를 지정한다. 예를 들어 값이 40이면 Heap Free 공간이 40% 미만이 되면 Heap 크기가 확대된다. MaxHeapFreeRatio 옵션과 함께 Heap 크기 조정을 담당한다.

-XX:NewRatio=<Value>

OS/JDK Version마다 다름

Young Generation Old Generation 비율을 결정한다. 예를 들어 이값이 2이면 Young:Old = 1:2 되고, Young Generation 크기는 전체 Java Heap 1/3 된다.

-XX:NewSize=<Value>

OS/JDK Version마다 다름

Young Generation 시작 크기를 지정한다. Young Generation 크기는 NewSize 옵션(시작 크기) MaxNewSize 옵션(최대 크기) 의해 결정된다.

-XX:OnError=<Command>

None

Fatal Error 발생할 경우(: Native Heap에서의 Out Of Memory Error), <Command> 지정된 OS 명령문을 수행한다. 비정상적인 JVM 장애 현상을 자세하게 분석하고자 경우에 주로 사용된다.

-XX:OnError="pmap %p"

 --> JVM에서 Fatal Error 발생하면 Process ID 대해 pmap 명령을 수행한다.

-XX:OnOutOfMemoryError=<Command>

None

Out Of Memory Error 발생할 경우, <Command> 지정된 OS 명령문을 수행한다. JDK 1.6 추가된 옵션으로, Out Of Memory Error Java에서 얼마나 보편적으로 발생하는지를 있다.

-XX:OnOutOfMemoryError="pmap %p"

 --> JVM에서 Fatal Error 발생하면 Process ID 대해 pmap 명령을 수행한다.

-XX:ParallelGCThreads=<value>

CPU 개수

Parallel Collector 사용할 경우, GC작업을 수행할 Thread 개수를 지정한다. 기본값은 CPU 개수이다. , Parallel GC 작업을 수행하기 위해 시스템 전체의 CPU 최대한 활용한다. 하나의 Machine 여러 개의 JVM 구동하는 환경이나, 하나의 Machine 여러 종류의 Application 공유해서 사용하는 환경에서는 옵션의 값을 낮게 설정해서 GC Thread 개수를 줄임으로써 성능 개선을 꾀할 있다. Context Switching 의한 성능 저하를 막을 있기 때문이다.

-XX:PermSize=<size>

Permanent Generation 최초 크기를 지정한다. Permanent Generation 최대 크기는 MaxPermSize 옵션에 의해 지정된다. 많은 수의 Class 로딩하는 Application 크기의 Permanent Generation 필요로 한며, Permanent Generation 크기가 작아서 Class 로딩하는 못하면 Out Of Memory Error 발생한다.

-XX:PretenureSizeThreshold=<value>

0

일반적으로 Object Young Generation 최초 저장된 시간이 흐름에 따라 Tenured Generation으로 Promotion된다. 하지만, Object 크기가 Young Generation보다 경우 JVM Old Generation Object 직접 저장하기도 한다. PretenuredSizeThreshold 옵션을 이용하면 Young Generation 거치지 않고 직접 Old Generation 저장하게끔 있다. 가령 옵션의 값이 1048576(1M)이면, 1M 크기 이상의 오브젝트는 Old Generation 바로 저장된다.

크기의 오브젝트를 Old Generation 직접 저장함으로써 불필요한 Minor GC 줄이고자 하는 목적으로 사용된다.

-XX:+PrintGCApplicationStoppedTime

False

Application에서 Stop 발생한 경우 소요된 시간 정보를 기록한다. 시간은 GC 작업 자체에 의한 Stop 뿐만 아니라 JVM 내부적인 이유로 Application Thread들을 Stop 시킨 경우를 포함한다.

-XX:+PrintGCDetails

False

GC 발생시 Heap 영역에 대한 비교적 상세한 정보를 추가적으로 기록한다. 추가적인 정보는 {GC 후의 Young/Old Generation 크기, GC 후의 Permanent Generation 크기, GC 작업에 소요된 시간} 등이다. Minor GC 발생한 경우 PrintGCDetails 옵션의 적용 예는 아래와 같다.

[GC [DefNew: 64575K->959K(64576K), 0.0457646 secs] 196016K->133633K(261184K), 0.0459067 secs]]

위의 로그가 의미하는 바는 다음과 같다.

*   GC 전의 Young Generation Usage = 64M, Young Generation Size = 64M

*   GC 전의 Total Heap Usage = 196M, Total Heap Size = 260M

*   GC 후의 Young Generation Usage = 9.5M

*   GC 후의 Total Heap Usage = 133M

*   Minor GC 소요 시간 = 0.0457646

Major GC 발생한 경우 PrintGCDetails 옵션의 적용 예는 아래와 같다.

111.042: [GC 111.042: [DefNew: 8128K->8128K(8128K), 0.0000505 secs]

111.042: [Tenured: 18154K->2311K(24576K), 0.1290354 secs] 26282K->2311K(32704K), 0.1293306 secs]

위의 로그는 Minor GC 정보 외에 다음과 같은 Major GC 정보를 제공한다.

*  GC 전의 Tenured Generation Usage = 18M, Tenured Generation Size = 24M

*  GC 후의 Tenured Generation Usage = 2.3M

*  Major GC 소요시간 = 0.12

(참고) PrintGCDetails + PrintGCTimeStamps 옵션의 조합이 가장 보편적으로 사용된다.

-XX:+PrintGCTimeStamps

False

GC 발생한 시간을 JVM 최초 구동 시간 기준으로 기록한다.

(참고) PrintGCDetails + PrintGCTimeStamps 옵션의 조합이 가장 보편적으로 사용된다.

-XX:+PrintHeapAtGC

Fasle

GC 발생 전후의 Heap 대한 정보를 상세하게 기록한다. PrintHeapAtGC 옵션과 PrintGCDetails 옵션을 같이 사용하면 GC 의한 Heap 변화 양상을 매우 정확하게 파악할 있다. 아래에 PrintHeapAtGC 옵션의 적용 예가 있다.

0.548403: [GC {Heap before GC invocations=1:

Heap

par new generation total 18432K, used 12826K [0xf2800000, 0xf4000000, 0xf4000000]

eden space 12288K, 99% used<1> [0xf2800000, 0xf33ff840, 0xf3400000]

from space 6144K, 8% used<2> [0xf3a00000, 0xf3a87360, 0xf4000000]

to space 6144K, 0% used<3> [0xf3400000, 0xf3400000, 0xf3a00000]

concurrent mark-sweep generation total 40960K, used 195K<4>[0xf4000000, 0xf6800000, 0xf6800000]

CompactibleFreeListSpace space 40960K, 0% used [0xf4000000, 0xf6800000]

concurrent-mark-sweep perm gen total 4096K, used 1158K<5> [0xf6800000, 0xf6c00000, 0xfa800000]

CompactibleFreeListSpace space 4096K, 28% used [0xf6800000, 0xf6c00000]

0.549364: [ParNew: 12826K<6>->1086K<7>(18432K<8>), 0.02798039 secs] 13022K->1282K(59392K)

Heap after GC invocations=2:

Heap

par new generation total 18432K, used 1086K [0xf2800000, 0xf4000000, 0xf4000000]

eden space 12288K, 0% used<10> [0xf2800000, 0xf2800000, 0xf3400000]

from space 6144K, 17% used<11> [0xf3400000, 0xf350fbc0, 0xf3a00000]

to space 6144K, 0% used<12> [0xf3a00000, 0xf3a00000, 0xf4000000]

concurrent mark-sweep generation total 40960K, used 195K<13> [0xf4000000, 0xf6800000, 0xf6800000]

CompactibleFreeListSpace space 40960K, 0% used [0xf4000000, 0xf6800000]

concurrent-mark-sweep perm gen total 4096K, used 1158K<14> [0xf6800000, 0xf6c00000, 0xfa800000]

CompactibleFreeListSpace space 4096K, 28% used [0xf6800000, 0xf6c00000]

} , 0.0297669 secs]

-XX:SoftRefLRUPolicyMSPerMB=<value>

1000(ms)

Soft Reference Java Heap에서 밀려나는 주기를 설정한다. 기본값이 1000ms(1)이다. JDK 1.3.1까지는 Soft Reference GC 작업 발생시 항상 메모리에서 해제되었다. 하지만 이후 버전에서는 Free Memory 비례해 일정 시간 정도 메모리에 보관하게끔 변경되었다. 가령 값이 1000(1)이면, Heap Free Memory 1M마다 바로 직전에 참조된 시간에서 1초가 지나지 않았다면 메모리에서 해제하지 않는다.

값을 크게 부여하면 Soft Reference 그만큼 오래 메모리에 머물고 사용 효율이 높아진다. 반면 메모리 점유율이 높아진다. 따라서 Applicaiton에서 Soft Reference 많이 사용하고, Free Memory 많지 않은 상황에서는 값을 낮출 필요가 있다. 반면 Soft Reference 기반하여 Cache 구현하고, Free Memory 여유가 있는 상황에서는 값을 높임으로써 성능 향상을 꾀할 있다.

-XX:SurvivorRatio=<value>

5~6(OS/Version마다 다름)

Survivor Space Eden Space 비율을 지정한다. 만일 값이 6이면, To Survivor Ratio:From Survivor Ratio:Eden Space = 1:1:6 된다. , 하나의 Survivor Space 크기가 Young Generation 1/8 된다. Survivor Space 크기가 크면 Tenured Generation으로 옮겨가지 전의 중간 버퍼 영역이 커지는 셈이다. 따라서 Full GC 빈도를 줄이는 역할을 있다. 반면 Eden Space 크기가 줄어들므로 Minor GC 자주 발생하게 된다.

-XX:+TraceClassLoading

False

Class Loading 추적하는 메시지를 뿌릴지의 여부를 지정한다. TraceClassUnloading 옵션과 함께 ClassLoader 문제를 추적하고자 사용된다.

-XX:+TraceClassUnloading

False

Class Unloading 추적하는 메시지를 뿌릴지의 여부를 지정한다. TraceClassLoading 옵션과 함께 ClassLoader 문제를 추적하고자 사용된다. 옵션은 JDK 1.6에서 추가되었다.

-XX:+UseAdaptiveSizePolciy

True

Parallel Collector 사용할 경우 Young Generation 크기를 Adaptive하게 적용할 지의 여부를 지정한다. Parallel Collector 목적은 Throughput 최대화하는 것이며, 목적에 따라 Young Generation 크기를 JVM 스스로 조정한다.

(주의) Adaptive Size 사용하는 경우 Young Generation 크기가 잘못 계산되어 Full GC 과잉 유발하는 것과 같은 오동작을 하는 경우가 있다. 이럴 경우에는 옵션의 값을 False(-XX:-UseAdaptiveSizePolicy) 변경해주어야 한다.

-XX:+UseCMSCompactAtFullCollection

True

CMS Collector 의한 Concurrent GC 수행 Compaction 작업을 수행할 지의 여부를 지정한다. 값이 True이면, Old Generation Fragmentation 의해 Promotion Failure 발생할 Stop The World 방식의 Full GC 수행하며 Compaction 이루어진다. JDK 1.4.2부터는 True Default 값이다. 자세한 내용은 CMSFullGCsBeforeCompaction 파라미터를 참조한다.

-XX:+UseCMSInitiatingOccupancyOnly

False

Concurrent Full GC 수행할 기준으로 최초에 지정된 비율을 고정적으로 사용할지의 여부를 지정한다. 최초의 비율은 CMSInitiatingOccupancyFraction 옵션에 의해 지정된다.

CMS Collector 사용하는 환경에서 Full GC 자주 발생하는 경우 CMSInitiatingOccupancyFraction 옵션의 값을 낮게(50이하) 지정하고, 옵션의 값을 True 지정하는 방법을 많이 사용한다.

-XX:+UseConcMarkSweepGC

False

CMS Collector 사용할 지의 여부를 지정한다. GC Pause 의한 사용자 응답 시간 저하 현상을 줄이고자 경우에 사용이 권장된다.

-XX:+UseParallelGC

환경에 따라 다름

Parallel Collector 사용할 지의 여부를 지정한다. JDK 1.4까지는 False 기본값이다. JDK 1.5부터는 서버급 머신인 경우에는 True, 클라이언트급 머신일 경우에는 False 기본값이다. 서버급 머신이란 CPU 2 이상, Physical RAM 2G 이상인 머신을 의미한다. 크기의 Young Generation 일반적인 엔터프라이즈 환경에서는 Parallel Collector 사용함으로써 Minor GC 의한 GC Pause 최소화할 있다. Parallel Collector Young Generation 대해서만 작동한다는 사실에 주의하자. Old Generation 대해 Parallel Collection 사용하고자 하는 경우에는 UseParallelOldGC 옵션을 사용한다.

-XX:+UseParallelOldGC

False

Old Generation 대해 Parallel Collection 수행할 지의 여부를 지정한다. JDK 1.6에서 추가된 옵션이다.

-XX:+UseParNewGC

환경에 따라 다름

CMS Collector 사용하는 경우에 한해서, Young Generation 대해서 Parallel Collection 수행할 지의 여부를 지정한다. 옵션과 UseParallelGC, UseParallelOldGC 옵션과의 차이를 명확하게 구분해야 한다.

-XX:+UseSerialGC

환경에 따라 다름

Serial Collector 사용할 지의 여부를 지정한다. JDK 1.4까지는 Default 값이 True이다. JDK 1.5에서는 UseParallelGC 옵션에서 설명한 것처럼 머신의 등급에 따라 Default 값이 결정된다.