Technical Note/JAVA

Tomcat GC 에 대한 튜닝 방법
  1. 4cpu 일때 young, old 영역에 대해서 GC가 이루어지고 old 영역이 70일때 Full GC가 일어남
  2. tomcat/bin의 catalina.sh에 추가
    Tomcat GC 옵션

    JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true -Dcom.sun.management.jmxremote"

    option 중 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps는 10분 마다 GC 상태를 찍을 경우 필요함(기본은 필요 없음)


JVM Memory구성 옵션
  1. 메모리는 최대 Physical Memory의 1/2정도 설정시까지 문제 없음
    JVM Memory구성 옵션

    -Xms<Size> : 초기의 전체 힙 메모리의 크기 설정
    -Xmx<Size> : 최대 전체 힙 메모리의 크기 설정
    -XX:NewSize=<Size> : Young 영역의 메모리 크기 설정
    -XX:MaxNewSize=<Size> : 최대 Young영역 메모리 크기 결정
    -XX:NewRatio=<n>: Young영역의 메모리 크기를 결정하는 또 다른 방식 전체 메모리 크기에서 1/(n+1)만큼 Young영역 메모리로 할당된다.


먼저 알아둬야할 지식 Java HotSpot VM이 세가지 영역으로 힙을 분할해서 사용한다는 것. 이것을 기반으로 GC 정책을 세운다.
  1. Permanent space (반 영구적인 영역 ) : JVM 클래스와 method 객체가 사용한다
  2. Old object space (오래된 객체의 공간) : 잠시동안 있는 객체가 사용한다.
  3. New (young) object space (새로운 객체 공간 ) : 새로 생성한 객체가 사용한다.
    JVM 옵션

    -XX:+UseSerialGC: Young영역에 대한 GC. Young영역에서 살아남은 객체를 Old영역으로 복사하는 방식으로 동작. GC Thread가 1개임. Stop-the-world방식임. 이 옵션은 Java SE 5 이후 버전만 사용 가능.

    -XX:+UseParallelGC: Young영역에 대한 GC. GC Thread가 여러개 동작하지만, Stop-the-world방식. 즉 Application Thread를 멈추고, 여러 Thread가 GC를 수행함. Young영역이 100%사용하게 되었을때 동작한다. -XX:ParallelGCThreads 과 함께 사용 가능.

    -XX:+UseParNewGC : CPU가 여러개 있는 서버의경우에 유용

    -XX:+UseTLAB : Thread가 많고 객체 생성이 빈번한 경우, 공유메모리를 사용하는 것 보다는 스레드별로 메모리를 할당하는 것이 좋다 .16개 이상의 CPU를 장착한 시스템의 경우 쓰레드별로 객체 생성을 하기 이한 옵션

    -XX:+UseConcMarkSweepGC : Stop the world의 시간을 줄이기 이해서 작업스레드와 병행하여 GC정보를 수집한다.(Mark-sweep방식) -XX:ParallelGCThreads와 함께 사용하는게 좋을듯. CPU가 두개 이상이라면 사용하는게 좋을듯 하다.

    -XX:ParallelGCThreads=<n>: 병렬 가비지 컬렉터에서 가비지 컬렉션 스레드 수를 지정. 기본값은 CPU수와 동일하다.