자바 힙메모리 부족 - jaba hibmemoli bujog

안녕하세요. 

실서버에서 스프링 프로젝트를 호스팅하여 운영하던 중에 java.lang.OutOfMemoryError 가 나타났습니다.

서버관리가 초보라 처음 보는 에러였기 때문에 여기저기 구글링을 하며

오류를 미연에 방지하고 다음에 또 비슷한 유형의 에러가 나오면 빨리 해결할수 있도록

자바 메모리에 대해 깊이있게 공부를 해보았습니다.

자바 메모리 구조가 궁금하신 분들은 밑의 링크를 참조하여주세요. 

제가 이번 에러를 통해 여기저기 글을 참조하며 최신 자바 버전에 맞게 변경된 내용까지 포함한 내용입니다.

글을 읽어보고 오류 해결방법을 읽어보는게 도움이 될것입니다.

developer111.tistory.com/33

[자바]JVM 구조 및 자바 메모리 구조

실서버에 톰캣7과 자바8으로 호스팅한 후 한달 정도 되니 서버가 다운되는 에러가 나타났다 로그를 찾아보니 java.lang.OutOfMemoryError: Java heap space 라고 적혀있었다. 실서버에 올려두고 서버 관리자

developer111.tistory.com

자바 힙메모리 부족 - jaba hibmemoli bujog

java.lang.OutOfMemoryError: heap space

위의 에러는 heap 영역의 공간이 부족해져서 생긴 오류입니다. 

힙 영역의 공간을 늘려주면 해결할 수 있는 부분입니다. 

저 또한 메모리가 부족해서 오류가 자주 발생하였지만 일단 중요한거 서버의 메모리가 확보되어있어야 합니다.

저는 AWS EC2 프리티어 환경에서 서버를 구동했는데 이 서버의 메모리는 1GB 밖에 되지 않아

실서버에서 정상적으로 구동하기에는 조금 버거운 용량이었습니다. 

그리하여 서버 메모리 용량도 늘려주었고 

톰캣 메모리설정 또한 늘려주었죠.

먼저 기본적으로 설정되어 있는 톰캣의 메모리 값을 확인해 보겠습니다. 

ps -ef | grep tomcat

위의 명령어를 이용하면 톰캣이 사용하고 있는 PID값을 알수 있습니다.

자바 힙메모리 부족 - jaba hibmemoli bujog

위와 같은 이미지에서 26625가 톰캣이 잡아먹고 있는 PID 값입니다. 

jmap -heap [PID값]

위 명령어를 실행해주면, 즉 저는 jmap -heap 26625라고 입력했겠죠. 

명령어를 입력하면

Heap Configuration:

   MinHeapFreeRatio         = 40

   MaxHeapFreeRatio         = 70

   MaxHeapSize              = 522190848 (498.0MB)

   NewSize                  = 11141120 (10.625MB)

   MaxNewSize               = 174063616 (166.0MB)

   OldSize                  = 22413312 (21.375MB)

   NewRatio                 = 2

   SurvivorRatio            = 8

   MetaspaceSize            = 21807104 (20.796875MB)

   CompressedClassSpaceSize = 1073741824 (1024.0MB)

   MaxMetaspaceSize         = 17592186044415 MB

   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:

New Generation (Eden + 1 Survivor Space):

   capacity = 34734080 (33.125MB)

   used     = 20507456 (19.55743408203125MB)

   free     = 14226624 (13.56756591796875MB)

   59.04131043632076% used

Eden Space:

   capacity = 30932992 (29.5MB)

   used     = 19153048 (18.265769958496094MB)

   free     = 11779944 (11.234230041503906MB)

   61.91786426608845% used

From Space:

   capacity = 3801088 (3.625MB)

   used     = 1354408 (1.2916641235351562MB)

   free     = 2446680 (2.3333358764648438MB)

   35.63211375269397% used

To Space:

   capacity = 3801088 (3.625MB)

   used     = 0 (0.0MB)

   free     = 3801088 (3.625MB)

   0.0% used

tenured generation:

   capacity = 76959744 (73.39453125MB)

   used     = 53364328 (50.892189025878906MB)

   free     = 23595416 (22.502342224121094MB)

   69.34057369005801% used

위와 같이 heap메모리 용량에 대해 영역별로 알 수 있을 것입니다. 

메모리 구조에 대해 알고 계신분들을 이름만 봐도 뭘 의미하는지 알 수 있을 거라고 생각합니다.

모르시는 분들은 포스팅글 상단에 메모리 구조에 관련된 글을 링크 걸어놨으니 읽어보는걸 추천드립니다.

자 이제, 메모리 용량값을 수정하겠습니다.

톰캣 메모리를 늘리는 톰캣 설치경로에 가서 /bin 파일로 들어가 

catalian.sh파일을 편집해줍니다.

vi catalina.sh

입력해주고

JAVA_OPTS 내용을 아래와 같이 수정하였습니다.

JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx1024m $JSSE_OPTS"

-Xms는 최소 힙영역 크기 -Xmx는 최대 힙영역 크기 값 입니다.

톰캣을 재구동하면 변경된 내용이 적용이 될것입니다. 

java.lang.OutOfMemoryError는 heap space 에러 외에도

GC Overhead limit exceeded, Requested array size exceeds VM limit, Metaspace등등 여러 종류의 에러가 존재합니다.

저 또한 처음 보는 에러들이기 때문에 하나하나 깊게 공부해보아야할 필요가 있어보입니다.