JVM(Java) 메모리 옵션 정리

JVM(Java) 메모리 옵션 정리

1. 최대 성능
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1G -Xmx16G -Xss4m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:+DisableExplicitGC -XX:-UseGCOverheadLimit"


2. 최대 안정 (for WebInspect)
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1G -Xmx16G -Xss4m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:+CMSClassUnloadingEnabled -Dsun.rmi.dgc.client.gcInterval=60000 -Dsun.rmi.dgc.server.gcInterval=60000 -XX:-UseGCOverheadLimit"

※ -XX:PermSize=512m -XX:MaxPermSize=512m는 Java 8에서 없어짐.

■ Heap영역 : new 연산자로 생성된 객체와 배열을 저장하는 영역으로 GC 대상이 되는 영역이다.

1.Eden, Survivor, Old로 나뉨
* new 키워드로 객체가 생성되면 eden 영역에 저장
* 지속적으로 Eden에 객체를 생성하다가 가득 차면 Minor GC(Young GC) 발생
* 쓰레기 객체들은 제거되고 아직 살아있는 객체들은 Survivor 영역으로 이동
* 반복되다가 Survivor 마저 꽉 차면 old 영역으로 이동

■ Non-Heap영역 : 스택, 클래스 area, method area 등의 heap영역을 제외한 나머지들.
Permanent : Class 메타정보, Method 메타정보, Static Object, 상수화된 String Object, Calss관련 배열 메타정보, JVM내부 객체와 최적화컴파일러(JIT)최적화 정보 등 포함

■ 옵션 설명
-Djava.awt.headless=true: WAS 옵션으로 비윈도우 환경에서 GUI 클래스를 사용할 수 있게 하는 옵션

-Dfile.encoding=UTF-8: new String(byte[] b) 또는 String getBytes() 실행시 인코딩 값

-Xms: 초기 Heap Size (init, default 64m)

-Xmx: 최대 Heap Size (Max,  default 256m)

-Xss: 개별 Thread의 Stack Size를 지정한다. 예를 들어 Thread Stack Size가 1MB(Default)이고, Thread가 최대 100개 활성화된다면, 최대 100M의 메모리를 사용하게 된다.

-XX:PermSize: 초기 PermSize (Java 8에서 없어짐)

-XX:MaxPermSize: 최대 PermSize (Java 8에서 없어짐)

-XX:NewSize: 최소 new size (객체가 생성되어 저장되는 초기공간의 Size로 Eden+Survivor 영역)

-XX:MaxNewSize: 최대 new Size

-XX:SurvivorRatio: New/Survivor영역 비율 (n으로 지정시 Eden : Survivor = 1:n)

-XX:NewRatio: Young Gen과 Old Gen의 비율 (n으로 지정시 Young : Old = 1:n)

-XX:+DisableExplicitGC: System.gc() 콜을 무시

-XX:+UseConcMarkWeepGC: 표준 gc가 아니나 Perm Gen영역도 gc하는 Concurrent Collertor를 사용

-XX:+CMSPermGenSweepingEnabled: Perm gen영역도 GC의 대상이 되도록 지정

-XX:+CMSClassUnloadingEnabled: 클래스 데이터도 GC의 대상이 되도록 지정

-XX:-UseGCOverheadLimit: "java.lang.OutOfMemoryError: GC overhead limit exceeded" 오류 방지

위로 스크롤