Java 메모리 영역 구조
- JVM은 힙을 아래와 같이 3개의 영역으로 나누고 있다.
1) Permanent Space : JVM 클래스와 메소드 개체를 위해 쓰인다.
2) Old Object Space : New 영역에서 count를 세어서 어느정도 증가된(만들어진지 좀 된) 개체를 위해 쓰인다.
3) New(Young) Object Space : 새로 생성된 개체들을 위해 쓰인다.
New Object Space는 다시 3개의 부분으로 나누어 지는데, 모든 새로 생성된 개체들이 가는 Eden(에덴동산)과 그 개체들이 Old Generation으로 가지 전 생존해 있는 Survivor Space(From, To) 1과 2가 있다.
Java 메모리에 의한 Out of Memory 해결방법
JDK1.4에서부터 -XX:PrintGCDetails -XX:PrintGCTimeStamps -XX:PrintHeapAtGC 옵션을 사용하여 GC한 상태의 Heap 메모리 정보를 출력한다.
이 정보를 통해 New, Old, Perm의 영역 중에서 실제 어느 영역부분이 부족하여 Error가 발생하는지 찾은 후 부족한 영역의 Size를 조정해 주는방법으로 해결할 수 있다.
그러나, 부족한 영역에 계속해서 메모리 할당을 해주어도 사용률 100%가 나온다면 프로그램 누수일 수 있으니 프로그램을 점검해봐야 한다.
Heap 메모리 영역이 어느정도 차게되면 JVM은 계속해서 GC(Garbage Collection)를 시도하게 되는데, 이는 GC의 수행시간을 짧게하여 시스템 속도가 저하되는 상황이 나타날 수 있으며, 결국엔 Out of Memory가 발생하게 된다.
명령행 스위치 | 설명 |
-Xms=[n] | 최소 Heap Size |
-Xmx=[n] | 최대 Heap Size |
-XX:PermSize=[n] | 최소 Perm Size |
-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% |
정적인 페이지들을 주로 서비스하는 경우 : 페이지 로딩에 필요한 Perm Size 위주로 메모리 튜닝
메모리 영역 | Size | 설정 | |
New Generation |
Eden |
174m |
-Xms418m -Xmx418m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:NewSize=290m -XX:MaxNewSize=290m -XX:SurvivorRatio=3 |
From |
58m | ||
To |
58m | ||
Old Generation |
128m | ||
Permanent Generaion |
1024m | ||
Total Heap Size |
1442m |
메모리 영역 | Size | 설정 | |
New Generation |
Eden |
534m |
-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:NewSize=800m -XX:MaxNewSize=800m -XX:SurvivorRatio=4 |
From |
133m | ||
To |
133m | ||
Old Generation |
224m | ||
Permanent Generaion |
128m | ||
Total Heap Size |
1052m |