개발놀이터

Cafe24 배포 중 OutOfMemoryError : Metaspace 본문

오류해결

Cafe24 배포 중 OutOfMemoryError : Metaspace

마늘냄새폴폴 2022. 7. 27. 00:43

프로젝트를 진행하고 배포만 하면 완료되는 상황에서 배포를 했는데 OutOfMemoryError를 만났다. 

 

org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'homeController' defined in file 
[/ks3254/tomcat/webapps/ROOT/WEBINF/classes/com/foryou/onlyonepagewithyou/controller/HomeController.class]: 
Unsatisfied dependency expressed through constructor parameter 0; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'carouselRepository' defined in com.foryou.onlyonepagewithyou.repository.CarouselRepository 
defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: 
Invocation of init method failed; nested exception is java.lang.OutOfMemoryError: Metaspace

 

구글링 해보니 JVM 메모리가 부족하면 생기는 현상이라는데...

 

OutOfMemory에도 여러 종류가 있다는 것을 구글링을 통해 알았다. 이번 포스팅은 그 중 Metaspace 오류 해결 방법에 대해 자세히 쓰려고 한다.

 

우선 Metaspace가 무엇인지 알아야했다. Metaspace는 쉽게 말해서 JVM의 클래스 로더를 통해 클래스들을 메타데이터로 만들고 저장해두는 공간이다. 

 

근데 나는 Metaspace가 뜰 만큼 클래스가 많다고 생각을 안했다. 자바클래스는 48개 라이브러리로 딸려온 jar파일도 25개밖에 안되는 작은 프로젝트였기 때문이다.

 

심지어 현재 배포하려는 프로젝트보다 더 큰 프로젝트도 cafe24로 배포해서 잘 쓰고있다. 더 작은 이번 프로젝트가 안된다는게 이해가 안됐다.

 

에러 로그를 하나하나 구글링 해가면서 삽질이란 삽질은 다했다. 지금 생각해보면 진짜 별에별거를 다 검색했다.

 

첫줄인 Error creating bean with name 불라불라 -> 빈이 생성 안되는 이유

좀 가다 보이는 Unsatisfied dependency expressed through constructor parameter -> 순환 참조일 때 뜨는 에러라고 한다. 하지만 나는 순환 참조를 사용하지 않았다. (삽질)

@EnableJpaRepositories -> JPA를 사용하면 JpaRepository를 상속받은 인터페이스를 자동으로 @Repository를 붙여준다고 하더라

 

그러다가 의미있는 구글링 정보를 찾아냈다.

 

https://honeyinfo7.tistory.com/173

 

Cafe24 톰캣 Out of Memory Error 해결

오늘 어느정도 일단락된 프로젝트를 Cafe24 웹서비스에 올렸는데 java.util.concurrent.executionexception: java.lang.outofmemoryerror: metaspace 와 같은 메시지와 함께 서비스가 안올라가지는 현상이 발견되..

honeyinfo7.tistory.com

 

나랑 똑같은 문제를 겪은 사람이 해결했다는 포스팅이었다. 

 

일단 catalina.sh라는 파일을 열어야 했다. 하지만 톰캣 재시작만 해본 나에게 리눅스는 커다란 벽이었다. 그래도 계속 구글링을 해가며 알아냈다.

 

catalina.sh 들어가는 방법 (cafe24 배포 기준)

1. putty를 켜고 계정을 연결한다.

2. cd tomcat

3. cd bin

4. vi catalina.sh

 

이러면 catalina.sh가 열린다. 어 근데 catalina.sh 어디에 적어야 하나 고민일 수 있다. 그냥 맨 첫번째에 나오는 #!/bin/sh 구문 바로 아래에 적으면 된다.

 

그리고 저 포스팅대로 그대로 따라했다.

 

vi 간단 조작법

입력모드 : i (입력모드는 관전모드일 때만 적용된다.)

관전모드 : ESC (방향키로 왔다갔다 할 수 있다.)

한글자 지우기 : x (관전모드에서만 사용 가능)

저장 후 종료 : ZZ (관전모드에서 쉬프트 zz 하면 된다)

 

그대로 따라했는데 이번엔 실행 자체가 안되는것이었다. 오류 내용은 JVM을 생성할 수 없다는 에러.

 

드디어 해결하나 싶었지만 또 안되는 상황에 멘탈이 나가기 직전이었다. 동아줄 붙잡는 마음으로 OKKY와 네이버 지식인에 글을 올렸다.

 

오키는 역시 개발자들 모인 커뮤니티 아니랄까봐 감정없고 성의없는 대답이 돌아왔다. 애초에 오키에 몇번 질문글을 올린 적 있지만 해결된 적이 한번도 없었기 때문에 이젠 그러려니 하고 넘어가게 되었다.

 

네이버 지식인에서도 답변이 달렸다. 메타스페이스 설정을 변경하라는 글이었다. 추가적인 질문으로 JVM 메모리가 64MB로 정해져있어도 메타스페이스를 변경할 수 있냐는 질문을 했다. 다시 돌아온 답변은 할 수 있다는 답변이었다.

 

그리고 또 구글링을 하기 시작했다. java metaspace 설정 이런식으로 검색하니까 답을 얻을 수 있었다.

 

바로 -XX:Metaspace=1024m -XX:MaxMetaspace=1024m 이거 두개를 JAVA_OPTS에 추가하면 된다는 것!

 

-XX:Metaspace=1024m은 메타스페이스를 1기가로 설정

-XX:MaxMetaspace=1024m은 메타스페이스의 최대 크기를 1기가로 설정이다.

 

이제 catalina.sh를 열어서 JAVA_OPTS의 디폴트 값과 내가 얻은 답을 적어 넣었다. 

 

결과적으로 내가 적은 설정은 이렇다.

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -XX:MetaspaceSize=1024m

-XX:MaxMetaspaceSize=1024m"

 

이렇게 설정하고 ZZ를 눌러 저장한 후에 톰캣을 재시작하니 거짓말처럼 스프링이 정상 작동하기 시작했다. 

 

거의 하루를 꼬박 갈아 넣어서 얻은 지식이니만큼 엄청나게 뿌듯하다. 이번 오류를 계기로 OutOfMemoryError 중 Metaspace에 대해 자세히 공부할 기회가 됐다. 얼마전 면접 준비로 JVM을 공부한 적이 있는데 구글링하다가 아는 내용이 나와서 내심 뿌듯한 기억도 있다. 

 

아무튼 이번 포스팅은 OutOfMemoryError : Metaspace 오류 해결 후기와 해결하는 방법을 아주 자세히 적었다. 하지만 이것은 cafe24에 한정적인 방법이며 ec2 환경에서는 어떻게 해결하는지 모른다. 이번 포스팅이 나같이 12시간씩 갈아넣어서 고생하지 말고 한번에 해결되는 꿀팁이 되기를 기원한다.