JAVA 메모리 영역 구조 + dev
2008/02/14 00:43 |
ㅇ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가 있다.
Old Generation이 어느정도 차 있거나 특정 Time이 지나면 GC가 발생한다.
이때, 참조가 있는 개체는 GC가 일어나더라도 남아있게 되는데 계속해서 쌓이면 Out Of Memory Error가 발생하게 된다.
ㅇ 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 Error가 발생하게 된다.
ㅇJVM 스위치 설정 예제
1) 2200여개의 JSP페이지를 가지고 있고 주로 정적인 페이지들 이므로 JSP파일 로딩에 필요한 Perm Size 위주로 메모리 튜닝을 하였다
2) 동적인 페이지들로 작성되어 있기 때문에 New Size 위주로 메모리 튜닝을 하였다.
[출처] JAVA 메모리 영역 구조|작성자 은찬쵝오