From d153afe30cff770c4b621641434b5feef81ceabb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A4=80=EC=98=81?= Date: Wed, 19 Aug 2026 19:56:51 +0900 Subject: [PATCH] =?UTF-8?q?T-03=20JVM=20=EB=A9=94=EB=AA=A8=EB=A6=AC=20?= =?UTF-8?q?=EC=83=81=ED=95=9C=EC=9D=84=20=EC=BB=A8=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=84=88=20=ED=95=9C=EB=8F=84=20=EC=95=88=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=AC=B6=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Xmx256m과 --memory=256m이 같아서 힙 혼자 컨테이너 한도를 다 먹을 수 있었다. 메타스페이스·코드캐시·스레드 스택이 그 위에 쌓이면 OOMKill이 발생하는 구조다. 힙 상한을 45%(약 115MiB)로 내리고 비힙 영역에 각각 상한을 둬서 전체 풋프린트를 예측 가능하게 만들었다. +ExitOnOutOfMemoryError로 좀비 상태 대신 재시작되게 한다. 의도적으로 넣지 않은 것: - -XX:+UseSerialGC — nproc=2 + 한도 256m이면 JVM이 이미 SerialGC를 자동 선택한다 (G1은 CPU>=2 그리고 메모리>=1792MB일 때). 효과 없는 플래그를 남기지 않는다. - -XX:TieredStopAtLevel=1 — 코드캐시는 아끼지만 피크 성능을 크게 깎아 보류한다. 이미지에 커밋 SHA 태그를 함께 붙인다. :latest 하나만 태깅해서 배포 실패 시 되돌릴 이전 이미지를 특정할 수 없던 문제를 같이 고친다. Refs #15 --- .github/workflows/deploy.yml | 4 +++- Dockerfile | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a2c1bab..e60c88c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -35,7 +35,9 @@ jobs: context: . push: true platforms: linux/arm64 - tags: ghcr.io/bcsdlab/bcsd-internal-api:latest + tags: | + ghcr.io/bcsdlab/bcsd-internal-api:latest + ghcr.io/bcsdlab/bcsd-internal-api:${{ github.sha }} - name: Deploy to server uses: appleboy/ssh-action@v1.0.3 diff --git a/Dockerfile b/Dockerfile index d65cf96..53f34a5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,4 +7,7 @@ FROM eclipse-temurin:21-jre-alpine WORKDIR /app COPY --from=builder /app/build/libs/*.jar app.jar EXPOSE 8081 -ENTRYPOINT ["java", "-Xmx256m", "-jar", "app.jar"] +# 컨테이너 한도(256m) 안에서 힙+비힙 전체를 예측 가능하게 묶는다. +# -Xmx256m은 힙 혼자 한도를 다 먹을 수 있어 메타스페이스/코드캐시/스택이 넘칠 때 +# OOMKill을 유발했다. nproc=2 + 한도 256m이므로 GC는 JVM이 SerialGC를 자동 선택한다. +ENTRYPOINT ["java", "-XX:MaxRAMPercentage=45.0", "-XX:MaxMetaspaceSize=112m", "-XX:ReservedCodeCacheSize=64m", "-XX:MaxDirectMemorySize=32m", "-XX:+ExitOnOutOfMemoryError", "-jar", "app.jar"]