근래에 들어와서 위의 메세지를 띄우면서 이클립스가 죽는 경우가 많이 생겼다. ‘out of memory’라는 단어만으로 단순히 메모리가 부족해서라고 생각했고, 웹검색을 통해서 이클립스를 실행할 때 JVM의 힙 메모리의 용량을 지정할 수 있는 방법을 찾아냈다.
OutOfMemoryError: PermGen space
메모리를 넉넉하게 지정하고 사용하면서 한동안 보이지 않았던 위의 에러 메세지가 얼마 전부터 다시 보이기 시작했다. 또 다시 웹 검색을 시작했다. 덕분에 오늘 많은 것들을 배울 수 있었다.
자바의 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’에러를 내 뿜으며 쓰러지곤 한다고 한다는 글들을 발견했다.
-vmargs
-Xverify:none
-XX:PermSize=64M
-XX:MaxPermSize=256M
-Xms256m
-Xmx512m
해결 방법으로 이클립스에 위의 내용처럼 옵션을 줘서 사용하기로 했다.
이클립스 뿐만 아니라 JVM을 사용하는 어플리케이션에서 메모리로 인한 에러가 발생한다면 메모리 관련 JVM옵션을 사용 해 주면 해결되니 좀 더 관련 자료를 봐 두기로 했다.
도움이 많이 되었던 문서들을 블로그에 남긴다.
신세대 hip 인줄 알았어요. ^^;;
옵션 사용하기는 어디서나 어렵군요. ㅠㅠ
저도 이런 부분이 있다는 것을 처음 알았습니다.
에러 덕분에 어쩌다 공부가 되어버렸습니다^^
저도 이것과 비슷한 이유로 고생했었는데, 도움이 될 것 같네요 ^^
화현님도 벌써 접하신 에러 메세지였군요!!
저는 얼마 전 부터.. 위에 문제가 속을 썩여서 최근에 알게 되었습니다.