garbage collection

20
Garbage Collectio n 김김김 2010.12.0 7

Upload: kim-jongseon

Post on 27-May-2015

1.934 views

Category:

Technology


4 download

DESCRIPTION

Garbage Collection 옵션 적용에 대한 Case Study이다.

TRANSCRIPT

Page 1: Garbage Collection

GarbageCollectionGarbage

Collection

김종선2010.12.0

7

김종선2010.12.0

7

Page 2: Garbage Collection

Garbage collection (GC) is a form of automatic memory management.

It is a special case of resource management, in which the limited resource being managed is memory.

Page 3: Garbage Collection

Minor GC Full GC

Page 4: Garbage Collection

Minor GC Full GC

Page 5: Garbage Collection

GC 발생 후

Page 6: Garbage Collection

Option 지정하기 Option 지정하기

• 단일값 -server Option 과 같이 옵션을 지정하면 그 자체로 의미를 지닌다 . • 크기 (Size) -Xmx768m 과 같이 크기 (K,M,G) 를 지정한다 . • 숫자 (Int) -XX:SurviorRatio=10 • 문자열 (String) -agentlib:hprof=cpu=samples • Boolean -XX:+PrintGCDetails 혹은 -XX:-PrintGCDetails와 같이 +/- 를 이용해서 활성화 /비활성 여부를 지정

Page 7: Garbage Collection

JVM_ARGS=“-Xss1m -Xms512m -Xmx512m“

JVM_ARGS="$JVM_ARGS -XX:PermSize=256m -

XX:MaxPermSize=256m"

JVM_ARGS=“-Xss1m -Xms512m -Xmx512m“

JVM_ARGS="$JVM_ARGS -XX:PermSize=256m -

XX:MaxPermSize=256m"

Page 8: Garbage Collection

Description

-Xmn<size>

Young Generation 이 거주하는 New Space 의 크기를 지정한다 . 대개의 경우 이 옵션보다는 -XX:NewRatio 옵션이나 -XX:NewSize 옵션을 많이 사용한다 .

-Xss<size>

개별 Thread 의 Stack Size 를 지정한다 . 대부분의 경우 기본값 (Default) 을 그대로 사용하는 것이 바람직하다 . 많은 수의 Thread 를 사용하는 Application 의 경우 Thread Stack 에 의한 메모리 요구량이 높아지며 이로 인해 Out Of Memory Error 가 발생할 수 있다 .

-Xms<size> Java Heap 의 최초 크기 (Start Size) 를 지정한다 . Java Heap은 -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx 옵션으로 지정한 크기만큼 커진다 .

-Xmx<size> Java Heap 의 최대 크기 (Maximum Size) 를 지정한다 . Java Heap 은 -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx 옵션으로 지정한 크기만큼 커진다 .

Page 9: Garbage Collection

JVM_ARGS="-J-server" JVM_ARGS="$JVM_ARGS -Xss512k

-Xmn128m -Xms768m -Xmx768m"JVM_ARGS="$JVM_ARGS -XX:PermSize=128m

-XX:MaxPermSize=128m"JVM_ARGS="$JVM_ARGS -XX:SurvivorRatio=14

-XX:MaxTenuringThreshold=15 -XX:GCTimeRatio=19 -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingOccupancyFraction=60 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps“

JVM_ARGS="-J-server" JVM_ARGS="$JVM_ARGS -Xss512k

-Xmn128m -Xms768m -Xmx768m"JVM_ARGS="$JVM_ARGS -XX:PermSize=128m

-XX:MaxPermSize=128m"JVM_ARGS="$JVM_ARGS -XX:SurvivorRatio=14

-XX:MaxTenuringThreshold=15 -XX:GCTimeRatio=19 -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingOccupancyFraction=60 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps“

Page 10: Garbage Collection

  Default Description

-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 작업을 활성화한다 .

-XX:+CMSPermGenSweepingEnabled

False

CMS Collector 는 기본적으로 Permanent Generation 에 대해 Collection 을 수행하지 않는다 . 따라서 많은 수의 Class 를 Loading 하는 경우 Out Of Memory Error 가 발생할 수 있다 . 이 옵션을 활성화하면 Permanent Generation 에 대한 Collection 을 수행한다 .

-XX:+DisableExplicitGC

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

-XX:PermSize=<size>

 

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

Page 11: Garbage Collection

  Default

Description

-XX:SurvivorRatio=<value>

5~6

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:+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 값이다 .

-XX:+UseConcMarkSweepGC

False

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

-XX:+UseParNewGC

CMS Collector 를 사용하는 경우에 한해서 , Young Generation 에 대해서 Parallel Collection 을 수행할 지의 여부를 지정한다 .

Page 12: Garbage Collection
Page 13: Garbage Collection
Page 14: Garbage Collection
Page 15: Garbage Collection
Page 16: Garbage Collection
Page 17: Garbage Collection
Page 18: Garbage Collection
Page 19: Garbage Collection

JVM_ARGS="-J-server" JVM_ARGS="$JVM_ARGS -Xss512k

-Xmn128m -Xms768m -Xmx768m"JVM_ARGS="$JVM_ARGS -XX:PermSize=128m

-XX:MaxPermSize=128m"JVM_ARGS="$JVM_ARGS -XX:SurvivorRatio=14

-XX:MaxTenuringThreshold=15 -XX:GCTimeRatio=19 -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingOccupancyFraction=60 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps“

JVM_ARGS="-J-server" JVM_ARGS="$JVM_ARGS -Xss512k

-Xmn128m -Xms768m -Xmx768m"JVM_ARGS="$JVM_ARGS -XX:PermSize=128m

-XX:MaxPermSize=128m"JVM_ARGS="$JVM_ARGS -XX:SurvivorRatio=14

-XX:MaxTenuringThreshold=15 -XX:GCTimeRatio=19 -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingOccupancyFraction=60 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps“

Page 20: Garbage Collection