Wednesday, July 21, 2010

갈릴레오 이클립스 메모리

참조 사이트

http://kwon37xi.egloos.com/2368729

http://blog.eclipsercp.or.kr/javanese/?p=34

http://wiki.ex-em.com/index.php/JVM_Options

http://blog.naver.com/taeung3?Redirect=Log&logNo=40092151514



1. 일단 메모리 옵션에 대해 알아보자.(eclipse.ini옵션 혹은 JVM 옵션)


자바 메모리 영역은 Java Heap space와 Permenant Generaton대상 데이터를 두기 위한 PermGen space로 구분된다고 한다.

클래스의 메타정보는 PermGen space에 들어가고 일반적인 프로그램 실행영역은 heap space인듯 하다.


out of memory 를 비롯하여 여러 메모리 문제는 이 두개의 영역의 크기를 조정함으로써 해결할수 있다.


설정할수 있는것으로는 각 메모리영역의 최초사이즈, 최대사이즈, 증가비율등 다양한데


여러문서에서는 가급적이면 최초사이즈와 최대사이즈를 같게 하는것이 사이즈 변경에 따른 시스템부하를 줄이므로 좋다고 한다.


2. ecipse.ini들여다 보기

일단 이클립스 갈릴레오 설치시 ini를 보면

--launcher.XXMaxPermSize

64m


-Xms128m

-Xmx128m

등이 있는데

--launcher.XXMaxPermSize는 Perm영역의 최대크기이고

-Xms는 힙영역의 시작크기, -Xmx는 힙영역의 최대크기이다.


따라서 힙역역이 모자란 경우에는 힙역역을 늘여주고 perm영역이 모자라면 perm영역을 늘여주면

메모리 부족현상은 해결할수 있을것이다.


주의할점은

최대크기는 시작크기와 같거나 커야 한다는 것이고,

두번째는 시스템의 메모리를 고려하여 너무 크게 잡지 말아야 한다는 것이다. 시작크기를 512m로 잡으면 실제 얼마의 메모리를 이용하든간에 시스템의 메모리중 512m을 이클립스가 자기영역으로 잡아버림으로 다른 것을 실행할 메모리가 줄어들게 된다.

세번째는 최대크기와 시작크기를 가급적 같이하라고 권장한다는 것이다.

앞서 말한 메모리 영역 증가시 발생하는 부하때문이다.


3. 이클립스에서 얼마나 많은 heap메모리를 사용하는지 알아보자

갈릴레오에는 힙상태 표시라는 옵션이 있어 현재사용량, 현재전체 메모리, 최대메모리등을 보여주고

힙영역을 정리도 해준다.(가비지 컬렉팅이라고 해야하나?)



windows>preference>General의 show heap status를 클릭한다.


한글팩에서는

창>환경설정>일반의 힙 상태 표시이다.


이것을 클릭하면 아래와 같이 메모리 상태를 알수 있다.



그리고 쓰레기통을 클릭하면 가비지컬렉팅이 되서 메모리가 정리된다.




4. JVM메모리 관련 옵션

XmnYoung Generation이 거주하는 New Space의 크기를 지정한다. 대개의 경우 이 옵션보다는 -XX:NewRatio 옵션이나 -XX:NewSize 옵션을 많이 사용한다.
-XmsJava Heap의 최초 크기(Start Size)를 지정한다. Java Heap은 -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx 옵션으로 지정한 크기만큼 커진다. Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여할 것을 권장한다. 크기의 동적인 변경에 의한 오버 헤드를 최소화하기 위해서이다.
-XmxJava Heap의 최대 크기(Maximum Size)를 지정한다. Java Heap은 -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx 옵션으로 지정한 크기만큼 커진다. Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여할 것을 권장한다. 크기의 동적인 변경에 의한 오버 헤드를 최소화하기 위해서이다.



-Xss개별 Thread의 Stack Size를 지정한다. 예를 들어 Thread Stack Size가 1M이고, Thread가 최대 100개 활성화된다면, 최대 100M의 메모리를 사용하게 된다. 대부분의 경우 기본값(Default)을 그대로 사용하는 것이 바람직하다. 많은 수의 Thread를 사용하는 Application의 경우 Thread Stack에 의한 메모리 요구량이 높아지며 이로 인해 Out Of Memory Error가 발생할 수 있다. 이런 경우에는 -Xss 옵션을 이용해 Thread Stack Size를 줄여주어야 한다.


-XX:+CMSPermGenSweepingEnabledFalseCMS Collector는 기본적으로 Permanent Generation에 대해 Collection을 수행하지 않는다. 따라서 많은 수의 Class를 Loading하는 경우 Out Of Memory Error가 발생할 수 있다. 이 옵션을 활성화하면 Permanent Generation에 대한 Collection을 수행한다. JDK 1.5까지는 이 옵션과 함께CMSClassUnloadingEnabled 옵션을 활성화해야 동작한다.



-XX:GCHeapFreeLimit=5Parallel Collector를 사용할 때 GC도중 Out Of Memory Error의 발생을 방지하는데 도움을 준다. GC로 확보해야할 Free Space의 하한선을 결정한다. 이 값은 Max Heap 크기에 대한 Free 공간 크기의 비율이며 기본값은 "5"이다. 즉 Parallel Collection 후 확보해야할 Free 공간 크기가 적어도 Max Heap 크기의 5% 이상이 되도록 보장하는 것이다.


워낙 많아서 여기를 참고 http://wiki.ex-em.com/index.php/JVM_Options

No comments: