🪓삽질노트

[JAVA] java.lang.OutOfMemoryError : Java heap space (2) 조사 방법 구현 & 결과 관찰

디카페인라떼 2022. 10. 26. 18:46

최종 프로젝트를 진행하면서 인프라를 담당하게 되었는데 그 중 마주친 OOM 에러.(22.10.13 THU) 

끝끝내 원인을 찾지는 못하였지만 어떻게 문제를 분석하고 임시방편이지만 어떻게 처리하였는지 기록해 보고자 한다. 

 

2022.10.26 - [🪓삽질노트] - [JAVA] java.lang.OutOfMemoryError : Java heap space (1) 문제 정의 & 사실 수집 & 원인 추론


 문제를 정의하면서 나름의 원인에 대한 가설을 3가지로 분류해보았다.

가설에 따른 문제해결 방법을 적용해본 후 경과를 관찰하였다. 

 

가설1 - Heap space 메모리 용량 부족 

  • 메모리 크기를 너무 적게 잡아 놓거나, 아예 메모리 크기를 지정하지 않은 경우
  • 해결방법
    • Heap space Memory 를 늘려주자!
    • free tier 인스턴스였으므로 1단계 늘려서 서버 Ram 용량을 1G->2G 로 높여준 뒤
    • Heap space 크기를 1기가 더 늘려주었다.
sudo nohup java -jar -Xms1024m -Xmx1024m $JAR_FILE > $APP_LOG 2> $ERROR_LOG &

자동배포를 사용하던 중이었으므로 서버 배포시 script를 수정해주었다. 

 

  • 결과
    • 오랜 시간 에러가 없나 싶었지만 이내 다시 OOM 에러가 나왔다.
    • 그저 힙 메모리 용량이 늘어나서 에러가 나오는 시간만 지연되었다.

 

 

가설2 - Swap 메모리 부족

  • 서버의 RAM 용량이 부족한 경우, SSD나 HDD의 공간을 RAM 처럼 사용가능하다.
  • 해결방법
    • Swap Memory를 할당해주자
sudo fallocate -l 2G /swapfile //swapfile  생성하기 (최대치인 2G)
sudo chmod 600 /swapfile // swapfile 권한수정
sudo mkswap /swapfile // swap영역 설정
sudo swapon /swapfile // swap 공간에 swap file을 추가하여 즉시 사용할 수 있도록함.
//부팅시 swap file 활성화 하기 
sudo nano /etc/fstab //편집기 열기

/swapfile swap swap defaults 0 0 // 하단에 내용 추가해준뒤 저장

free -h // 메모리 잘 할당 되었는지 확인

  • 결과
    • (당연히) 실패.. 
    • 사실 swap memory는 현 에러와 맞지 않았다. swap 공간이 부족했다면 다른 에러 메세지가 나왔을 것이다.
    • java.lang.OutOfMemoryError: Out of swap space

사실 원인 자체를 알지 못하고 일단 이렇게 해보면 되지않을까? 하고 냅다 해버렸다.

되면 좋고 안되면 다시 해보지 라는 마인드로 접근했던 게 컸다.

 

일단 문제 자체가 생소해서 인지 원인을 깊게 파고 싶어도 모든 게 생소했던 탓도 컸다.

어째든 가설들이 모두 실패하였으니 다시 원인 추론으로 돌아가서 이제는 도구를 써서 제대로 확인을 해보고자 한다. 

 


참고 블로그