힙의 세 영역은 다음과 같다:
1) Permanent space: JVM 클래스와 메소드 개체를 위해 쓰인다.
2) Old object space: 만들어진지 좀 된 개체들을 위해 쓰인다.
3) New(young) object space: 새로 생성된 개체들을 위해 쓰인다.
<Heap layout 할당에 영향을 주는 스위치들 >
*명령행 스위치 설명
-Xms=[n] 최소 heap size
-Xmx=[n] 최대 heap size
-XX:PermSize=[n] 최소 perm size
( JVM에서 OutOfMemoryError: PermGen space 에러가 자주 발생할 때
Heap 메모리가 부족하여 발생하는 줄 알고 -Xmx 옵션으로 늘려도 똑같이 발생.
원인은 PermSize 옵션 때문 .
PermSize는 JVM에서 사용하는 메타데이터에 대한 정보(즉 영구적으로 사용하는)에 대한 저장공간이다. 대표적인 예가 리플렉션에서 사용하는 클래스에 대한 정보들이다.
최근에 와서야 이런 오류가 자주 발생하는 이유는 Spring 프레임워크를 사용하기 때문이다. Spring 프레임워크에서는 AOP, DI 들을 지원하기 위해 많은 리플렉션 기능을 사용하고 Proxy를 이용하여 runtime에 클래스를 만들어 사용한다. 따라서 기존 방식에 비해 많은 메타데이터 저장공간이 필요하게 되었던 것이다. )
-XX:MaxPermSize=[n] 최대 perm size
-XX:NewSize=[n] 최소 new size
-XX:MaxNewSize=[n] 최대 new size
-XX:SurvivorRatio=[n] New/survivor 영역 비율
-XX:newratio=[n] Old/new 영역 비율. HotSpot 클라이언트 VM은 8, HotSpot 서버 VM은 2.
-XX:TargetSurvivorRatio=[n] GC동안 비울 생존자 수용 가능량 퍼센티지 (capacity percentage.) 초기값은 50%
-XX:+HeapDumpOnOutOfMemoryError HeapDumpOnOutOfMemory 명령줄 옵션을 사용하면 Out Of Memory 오류 상태가 되었을 때 JVM이 Java 힙의 스냅샷을 덤프하게 됩니다. HeapDumpOnOutOfMemoryError 기능은 SDK 1.4.2.11 및 JDK 1.5.0.04와 함께 사용할 수 있습니다.
* New Generation 메모리 할당 공식
Eden = NewSize - ((NewSize/(SurvivorRatio + 2)) * 2)
From space = (NewSize - Eden)/2
To space = (NewSize - Eden)/2
* Old Generation 메모리 할당 공식
Old = Xmx - MaxNewSize
* GC한 상태의 Heap메모리 정보출력
jdk1.4에서 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
* 정적페이지가 많을 때
-Xms418m -Xmx418m
-XX:PermSize=1024m
-XX:MaxPermSize=1024m
-XX:NewSize=290m
-XX:MaxNewSize=290m
-XX:SurvivorRatio=3
* 동적인 페이지가 많을 때
-Xms1024m -Xmx1024m
-XX:PermSize=128m
-XX:MaxPermSize=128m
-XX:NewSize=800m
-XX:MaxNewSize=800m
-XX:SurvivorRatio=4
-Xms384m -Xmx384m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=3
set CATALINA_OPTS=-Xms384m -Xmx384m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=3
Xms: 최초 JVM 이 로드될 때 부여할 메모리 |
4 |
Xmx: 최대 JVM 이 가질 수 있는 메모리 |
5 |
MaxPermSize: JVM 내의 클래스 정보가 담길 최대 메모리 |