Skip to content

Fix: Render Free 플랜 메모리 초과로 인스턴스가 종료되는 문제 #139

Closed

Description

@ppp1969

🧩 발생 기능

Render Free 플랜에서 실행되는 백엔드 Web Service 배포/부팅 및 백그라운드 처리

💥 발생 상황

Render 무료 플랜의 512MB 메모리 제한에서 백엔드 인스턴스가 아래 로그와 함께 종료되었습니다.

기존 Render 환경변수 또는 Dockerfile JVM 설정이 -Xmx384m 기준이라 heap 외 메모리까지 포함한 실제 RSS가 512MB를 초과할 수 있었습니다. JVM은 heap 외에도 metaspace, thread stack, code cache, direct memory를 사용합니다.

추가로 이미지 생성과 EPUB 정규화 비동기 작업이 동시에 실행될 수 있었고, 캐릭터 이미지 업로드 과정에서 base64 재인코딩/재디코딩으로 불필요한 메모리 복사가 발생했습니다.

📝 To-do

  • Render Free 512MB 기준 JVM 옵션 축소
  • Spring lazy initialization 기본 활성화
  • Swagger/OpenAPI 기본 비활성화
  • Hibernate batch fetch size 축소
  • 이미지 생성 executor 동시 실행 수 1개로 제한
  • EPUB 정규화 executor 동시 실행 수 1개로 제한
  • 이미지 업로드 시 base64 재인코딩/재디코딩 제거
  • Render 배포 runbook 환경변수 갱신
  • 전체 테스트 실행

🧪 예상 응답

Render Free 환경에서 백엔드가 부팅 및 일반 요청 처리 중 512MB 제한을 넘지 않도록 메모리 헤드룸을 확보합니다.

Render Dashboard의 Environment Variables에는 아래 값을 추가 또는 교체해야 합니다.

# 기존 JAVA_TOOL_OPTIONS가 있으면 아래 값으로 교체
JAVA_TOOL_OPTIONS=-Xms64m -Xmx256m -XX:+UseSerialGC -XX:ActiveProcessorCount=1 -XX:MaxMetaspaceSize=128m -XX:ReservedCodeCacheSize=64m -XX:MaxDirectMemorySize=32m -Xss256k -XX:+ExitOnOutOfMemoryError

# 없으면 새로 추가
SPRING_MAIN_LAZY_INITIALIZATION=true
SPRINGDOC_ENABLED=false
HIBERNATE_DEFAULT_BATCH_FETCH_SIZE=100

# 기존 값이 없다면 함께 추가 권장
DB_MAX_POOL_SIZE=2
DB_MIN_IDLE=1

주의: Render Dashboard에 JAVA_TOOL_OPTIONS가 설정되어 있으면 Dockerfile의 JAVA_TOOL_OPTIONS보다 우선 적용됩니다.

📸 ScreenShot & Log

Instance failed: r8xxz
Ran out of memory (used over 512MB) while running your code.
July 14, 2026 at 3:02 PM

Instance failed: r8xxz
Exited with status 137 while running your code. Check your service logs for more information.
July 14, 2026 at 2:57 PM

ETC

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions