근래에 들어와서 위의 메세지를 띄우면서 이클립스가 죽는 경우가 많이 생겼다. 'out of memory'라는 단어만으로 단순히 메모리가 부족해서라고 생각했고, 웹검색을 통해서 이클립스를 실행할 때 JVM의 힙 메모리의 용량을 지정할 수 있는 방법을 찾아냈다.

  메모리를 넉넉하게 지정하고 사용하면서 한동안 보이지 않았던 위의 에러 메세지가 얼마 전 부터 다시 보이기 시작했다. 또 다시 웹 검색을 시작했다. 덕분에 오늘 많은 것들을 배울 수 있었다.

  자바의 Heap공간은 내가 알던 것 보다 더 많은 부분으로 나누어져 있다는 것을 알게 되었고 더불어 GC(Garbage Collection)에 대한 부분도 몇 가지 GC알고리즘이 있고 그 중 어플리케이션의 사용 환경에 따라 선택하여 사용할 수 있게 하는 JVM옵션이 있다는 것도 알았다.


New/Young(신세대 힙)
- 객체가 생성되자마자 저장되고, 생긴지 얼마 안된 객체가 저장되는곳. 이 곳에 있는 객체들은 시간이 지남에 따라 우선순위가 낮아지면서 Old영역으로 옮겨진다.

Old 영역(구세대 힙)
- New/Young 영역에 저장되었던 객체중에 오래된 객체가 이동되어 저장되는 영역

Perm 영역(영구세대 힙)
- Class, Method 등의 Code 등이 저장되는 영역. JVM에 의해서 사용된다.



  JVM의 Heap공간은 위의 3가지가 있는데, 내 문제는 그 중에서도 Perm영역의 메모리 공간이 부족했던 것 같다. 이클립스의 WTP를 쓰다보면 클래스의 양이 늘어남에 따라 Permanent generation의 공간이 부족하게 되고, 부족하게 되면 종종 이클립스가 'OutOfMemoryError: PermGen space'에러를 내 뿜으며 쓰러지곤 한다고 한다는 글들을 발견했다.

eclipse.ini 수정

-vmargs
-Xverify:none
-XX:PermSize=64M
-XX:MaxPermSize=256M
-Xms256m
-Xmx512m


    해결 방법으로 이클립스에 위의 내용처럼 옵션을 줘서 사용하기로 했다.

  이클립스 뿐만 아니라 JVM을 사용하는 어플리케이션에서 메모리로 인한 에러가 발생한다면 메모리 관련 JVM옵션을 사용 해 주면 해결되니 좀 더 관련 자료를 봐 두기로 했다.



[출처] : 재미있는 세상, 즐거운 세상

+ Recent posts