Web/기타2013. 12. 6. 11:41

안녕하세요.

 

오늘은 Tomcat 메모리 설정에 관해서 포스팅을 하고자 합니다.

기본적으로 Tomcat 또는 Java 실행시 메모리가 상당히 중요한데요.

 

어떠한 목적을 위해 사용하느냐에 따라서 Tomcat (Java) 의 메모리 설정이 중요합니다.

 

저 역시.. 프로젝트를 위해 테스트 하던도중 Tomcat 메모리 설정을 이리저리 변경해보고

추후에 참고하고자 이 글을 작성하게 되었네요. 참 .. CentOS 기준입니다.

 

우선 Tomcat 의 경우 실행할때에 옵션을 줄수있습니다.

다만 이 옵션이 Tomcat 을 실행할때 다른 프로세스와 다르게 CATALINA_OPTS 라는 변수로 추가를 해줘야 합니다.

방법은 정해져 있지 않습니다. Tomcat 설치 디렉토리의 bin 폴더 밑에 catalina.sh 에

추가해주거나 접속한 계정의 홈 디렉토리에 있는 .bash_profile 이나 /etc/profile 에 추가해줘도 전혀 문제 없습니다.

(Tomcat 실행시 CATALINA_OPTS 라는 변수를 참고해서 실행하기에 그렇습니다.)

 

우선 Tomcat 의 CATALINA 옵션에 대해 알아보겠습니다.

 

- server : Server HotSpot JVM을 사용하는 옵션입니다. Server HotSpot JVM은 Desktop용 Appkication을 구동하는데 유리하고,

                최적화(Optimization)에 필요한 모든 과정을 최대한으로 수행합니다. Application의 시작시간은 느리지만, 일정 시간이 흐르면 Client HotSpot JVM에

              비해 훨씬 뛰어난 성능을 보장합니다.
    Jdk 1.5부터는 Server-Class머신인 경우에는 -server 옵션이 기본값이며, Server-Class머신이란 2장 이상의 CPU와 2G이상의 메모리를 갖춘 머신을 의미합니다.

- Xms<size>

 : Java Heap의 최소 크기값을 지정하는 부분입니다. Java Heap Size는 -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx옵션으로 지정한 크기만큼 증가합니다.
- Xmx<size>

 : Java Heap의 최대 크기값을 지정하는 부분입니다. -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx옵션으로 지정한 크기만큼 증가합니다.
   Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여할 것을 권장하고 있으며, 크기의 동적인 변경에 의한 오버 헤들를 최소화하기 위해서입니다.

- XX:NewSize=<Value>

 : New Generation의 시작 크기를 지정값 입니다.
- XX:MaxNewSize=<value>

 : New Generation의 최대 크기를 지정값 입니다.
   New Generation의 크기는 NewSize옵션값과 MaxNewSize옵션값에 의해 결정됩니다
 
- XX:PermSize=<size>

 : Permanent Generation의 최초 크기를 지정하는 값입니다.
- XX:MaxPermSize=<size>

 : Permanent Generation의 최대 크기를 지정하는 값입니다.
  많은 수의 Class를 사용하는 Application들은 Permanent Generation의 크기가 작을 경우 Out of Memory Error가 발생하며 Class를 로딩하지 못하거나

      사용중 다운되는 경우 때문에 초기 Permanent Generation의 값을 메모리에 여유가 있다면 넉넉하게 주는 것이 좋습니다.
 
- XX:NewRatio=<value>

 : New Generation과 Old Generation의 비율을 결정합니다.
  자세하게 안내되어 있는 블로그 링크를 남김니다.  http:⁄⁄helloworld.naver.com⁄helloworld⁄184615
 
- XX:SurvivorRatio=<value>

 : Survivor Space와 Eden Space의 비율을 지정하는 값입니다. 만일 이 값이 6이면, To Survivor Ratio:From Survivor Ratio:Eden Space = 1:1:6 이 됩니다.
   즉, 하나의 Survivor Space의 크기가 New Generation의 1⁄8 이 된다. Survivor Space의 크기가 크면 Tenured Generation으로 옮겨가기 전의 중간 버퍼 영역이

   커지는 게 됩니다. 따라서 Full GC의 빈도를 줄이는 역할을 할 수 있는 반면 Eden Space의 크기가 줄어들므로 Mirror GC가 자주 발생하게 될 가능성이

   있습니다.

- XX:ReservedCodeCacheSize=<value>

 : Code Cache의 최대 사이즈의 크기(byte) 설정값 입니다.

- XX:+DisableExplicitGC

 : System.gc 호출에 의한 Explicit GC를 비활성화하며, RMI에 의한 Explicit GC나 Applicaton에서의 Explicit GC를 원천적으로 방지하고자 할 경우에 사용됩니다.

- XX:+UseConcMarkSweepGC

 : CMS Collector를 사용할 지의 여부를 지정하는 옵션이며, GC Pause에 의한 사용자 응답 시간 저하 현상을 줄이고자 할 경우에 사용이 권장됩니다.

- XX:+AggressiveOpts

 : 최신 HotSpot VM 성능을 최적화하는 옵션입니다.

- Djava.net.preferIPv4Stack

 : IPv4인식하기 위해 사용합니다.

- Djava.awt.headless

 : 비윈도우 환경에서 GUI 클래스를 사용할 수 있게 하는 옵션입니다.

 

 

 

해서.. 저의 경우 /etc/profile 에 JAVA_HOME 과 같이 CATALINA_OPTS 변수를 추가해서 아래의 처럼 사용 중입니다.

 

 

CATALINA_OPTS="-server -Xms2048M -Xmx2048M -XX:PermSize=128M -XX:MaxPermSize=128M -Xnoclassgc -XX:NewSize=512M -XX:MaxNewSize=1024M -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=50 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+AggressiveOpts -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true"

 

이상입니다.

 

Posted by 소울하트